WinAPI - pobranie tekstu z kontrolek i przekazanie do funkcji

WinAPI - pobranie tekstu z kontrolek i przekazanie do funkcji
LO
  • Rejestracja:prawie 20 lat
  • Ostatnio:ponad 4 lata
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)

Kopiuj
 
int szyfrujTekst(unsigned char doZaszyfrowania, unsigned char *tekstZaszyfrowany);
Kopiuj
 
	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! :)

edytowany 1x, ostatnio: LOSMARCELOS
KA
Zacznijmy od tego że nie wiem co teraz szyfrujesz ale raczej nie pobrany tekst bo przecież go zwolniłeś przed szyfrowaniem.
LO
Już poprawione, coś tam jeszcze sprawdzałem i pomieszałem linijki przy edycji. Błąd jest nadal.
_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:3 miesiące
1
Kopiuj
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); 
  }

Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
edytowany 2x, ostatnio: _13th_Dragon
LO
Hmmm wyrzuca błąd przy kompilacji: Error 2 error C2664: 'GetDlgItemTextA' : cannot convert parameter 3 from 'LPCSTR' to 'LPSTR' Da radę zostawić tą funkcję jak jest? żeby jeden parametr był przed a drugi po szyfrowaniu? Wejście/wyjście?
_13th_Dragon
Można, ale wtedy musisz przewidzieć ile znaków zajmie zaszyfrowany tekst.
LO
No tak racja, zapomniałem, że to nie C# :-) Tam to po prostu zrobiłem parametr wejściowy string,a wynik zwracam jako wynik funkcji (string). Tutaj nie ma tak prosto. Chodzi o to, żeby tą DLL w C/C++ dało się wykorzystać w jak największej ilości języków (VB, Delphi, C++)
_13th_Dragon
Jak w C# dasz zwracanie przez string to użyć ten DLL mogłeś jedynie pod C# lun inny .NET, natomiast jak zrobisz tak jak pokazałem - to naprawdę dowolny język.
LO
  • Rejestracja:prawie 20 lat
  • Ostatnio:ponad 4 lata
0

Przerobiłem kod:

Kopiuj
	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ć:

Kopiuj
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;
}
 
edytowany 2x, ostatnio: LOSMARCELOS
fasadin
  • Rejestracja:prawie 14 lat
  • Ostatnio:prawie 3 lata
  • Postów:4882
3
Kopiuj
*tekstZaszyfrowany = *(unsigned char*)str_tekstZaszyfrowany.c_str();  

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

edytowany 1x, ostatnio: fasadin
LO
  • Rejestracja:prawie 20 lat
  • Ostatnio:ponad 4 lata
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;

edytowany 3x, ostatnio: LOSMARCELOS
fasadin
tak sie nie kopiuje cstringow. Poczytaj sobie jak sie kopiuje napisy w C i zastosuj to tutaj ;)
_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:3 miesiące
1

Ja pergole widzę! Tyle syfu:

Kopiuj
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:

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

Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
edytowany 1x, ostatnio: _13th_Dragon
LO
Przerobiłem to, ale się wiesza... Wiem, że można to skrótem napisać... Ale jeszcze coś sprawdzę w moim Visualu
LO
Działa!!!! Teraz muszę rozkminić funkcję deszyfrującą :-)
_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:3 miesiące
3
Kopiuj
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);
  }

Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
LO
O dzięki, tak samo chciałem zrobić :) przesunięcie :) to tzw. szyfr Cezara :) Kurczę, na tych tutorialach po ang. są czasem właśnie algorytmy, ale napisane niestety czasem w pokrętny sposób. Jeszcze raz dzięki za pomoc :-)
LO
  • Rejestracja:prawie 20 lat
  • Ostatnio:ponad 4 lata
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?

Kopiuj
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)

Kopiuj
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-' ')+' ';


}
 
edytowany 4x, ostatnio: LOSMARCELOS

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.