WinAPI - pobranie tekstu z kontrolek i przekazanie do funkcji

0

Hej! Muszę z okna dialogowego pobrać tekst, podstawić go do funkcji i odebrać wynik, wynik zapisać do kolej kontrolki edycyjnej (EDITTEXT)

Prototyp funkcji (zrobiłem ją w osobnej DLL)

 
int szyfrujTekst(unsigned char doZaszyfrowania, unsigned char *tekstZaszyfrowany);
 
	char* pstrText;
	unsigned char chWynik; 
	int iChars = GetWindowTextLength (GetDlgItem(hDlg,IDC_EDIT_TEKST_DO_ZASZYFROWANIA))+1;
	pstrText = (char*) malloc (sizeof(char)*iChars);
	if (pstrText != NULL) {
			GetDlgItemText(hDlg,IDC_EDIT_TEKST_DO_ZASZYFROWANIA,pstrText,iChars);
 			 szyfrujTekst((unsigned char)pstrText, &chWynik);
		 free (pstrText); 
	}

	SetDlgItemText(hDlg, IDC_EDIT_TEKST_PO_ZASZYFROWANIU, (LPCSTR)chWynik); // tu się wysypuje

Albo może globalne pytanie :
jak poprawnie przekazać napis do funkcji w języku C oraz tą samą funkcją go zwrócić po modyfikacjach wewnątrz funkcji oraz jak wywołać tą funkcje danymi z kontrolki edycyjnym (czyste WINAPI).
Z góry dzięki za pomoc! :)

1
void szyfrujTekst(unsigned char *text)
  {
   //szyfrujesz w to samo miejsce
  }
 
unsigned char *pstrText;
int iChars=GetWindowTextLength(GetDlgItem(hDlg,IDC_EDIT_TEKST_DO_ZASZYFROWANIA))+1;
pstrText=(unsigned char*)malloc(iChars);
if(pstrText)
  {
   GetDlgItemText(hDlg,IDC_EDIT_TEKST_DO_ZASZYFROWANIA,(LPSTR)pstrText,iChars+1); // tu była literówka
   szyfrujTekst(pstrText);
   SetDlgItemText(hDlg,IDC_EDIT_TEKST_PO_ZASZYFROWANIU,(LPCSTR)pstrText);
   free(pstrText); 
  }
0

Przerobiłem kod:

	unsigned char *pstrText;
	int iChars=GetWindowTextLength(GetDlgItem(hDlg,IDC_EDIT_TEKST_DO_ZASZYFROWANIA))+1;
	pstrText=(unsigned char*)malloc(iChars);
	if(pstrText)
	  {
	   GetDlgItemText(hDlg,IDC_EDIT_TEKST_DO_ZASZYFROWANIA,(LPSTR)pstrText,iChars+1);
	   szyfrujTekst(pstrText);
	   SetDlgItemText(hDlg,IDC_EDIT_TEKST_PO_ZASZYFROWANIU,(LPSTR)pstrText);
	   free(pstrText); 
  }
	if (hDll != NULL)
	{
		FreeLibrary( hDll );
	} 
 

Tekst do zaszyfrowania:
Test1
Zaszyfrowany wychodzi:
[]est1 // tutaj jest znak specjalny na początku, zamiast T jest takie pionowe puste okienko coś jak [] złączone

Hmm może teraz muszę coś głębiej w kodzie szyfrowania zmienić:

SZYFRATORLIB_API int szyfrujTekst(unsigned char *tekstZaszyfrowany)
{

string str_tekstZaszyfrowany = ""; // wynik;
str_tekstZaszyfrowany = encrypt(string(1, (unsigned char)tekstZaszyfrowany), 5);
*tekstZaszyfrowany = *(unsigned char*)str_tekstZaszyfrowany.c_str(); 

return 0;


}



string encrypt(string source, int key)
{
    string Crypted = source;

    for (unsigned int Current = 0; Current < source.length(); Current++)
        Crypted[Current] = ((Crypted[Current] + key) - 32) % 95 + 32;
        return Crypted;
}
 
3
*tekstZaszyfrowany = *(unsigned char*)str_tekstZaszyfrowany.c_str();  

wytlumacz mi co ta linijka kodu ma robic. (nie co chcesz osiagnac tylko co rzeczywiscie ona robi)

0

Chce zwrócić w parametrze zaszyfrowany string... tzn. jako unsigned char *
Inaczej: podany łańcuch znaków jest przekształcany na stringa w C++, funkcja przerabia stringa i chce to z powrotem zwrócić jako zmodyfikowany parametr (muszę dokonać konwersji ze stringa na unsigned char*)

P.S. W opcjach projektu ustawiłem: Character Set: Not Set;

1

Ja pergole widzę! Tyle syfu:

SZYFRATORLIB_API int szyfrujTekst(unsigned char *tekstZaszyfrowany)
{
 
string str_tekstZaszyfrowany = ""; // wynik;
str_tekstZaszyfrowany = encrypt(string(1, (unsigned char)tekstZaszyfrowany), 5);
*tekstZaszyfrowany = *(unsigned char*)str_tekstZaszyfrowany.c_str(); 
 
return 0;
 
 
}
 
 
 
string encrypt(string source, int key)
{
    string Crypted = source;
 
    for (unsigned int Current = 0; Current < source.length(); Current++)
        Crypted[Current] = ((Crypted[Current] + key) - 32) % 95 + 32;
        return Crypted;
}

zamiast:

void szyfrujTekst(unsigned char *str,int key)
  {
   for(;*str;++str) *str=(*str-' '+key)%(128-' ')+' ';
  }
3
void szyfrujTekst(unsigned char *str,int key)
  {
   key=(key%(128-' ')+(128-' '))%(128-' ');
   for(;*str;++str) *str=(*str+128-' '-' '+key)%(128-' ')+' ';
  }
void deszyfrujTekst(unsigned char *str,int key)
  {
   szyfrujTekst(str,-key);
  }
0

Jeszcze chciałem zmodyfikować funkcje...
Przy szyfrowaniu pod koniec dodaje np. znak Y na końcu ciągu znaków, a przy deszyfrowaniu "odejmuje" ten znak:
Dobrze zrobiłem?

void szyfrujTekst(unsigned char *str)
{
	int key=5;
	for(;*str;++str) *str=(*str-' '+key)%(128-' ')+' ';
	memcpy (str, "Y", sizeof(str));
	return 0;
}

 

No i przy deszyfrowaniu odejmujemy nadmiarowe "y" (tzn. generalnie każdą ostatnią literę jaka jest na końcu stringa)

void deszyfrujTekst(unsigned char *str)
{

int key=5;
    int i = 0;
    while(str[i] != '\0')
    {
        i++;
         
    }
    str[i-1] = '\0';
	
for(;*str;++str) *str=(*str-' '-key)%(128-' ')+' ';


}
 

1 użytkowników online, w tym zalogowanych: 0, gości: 1