Krystian Strójwąs

Krystian Strójwąs Sourceful
Information
Technology Services

Temat: Visual Studio VS CodeBlocks grrrr

Witam mam mały problem z Visual studio mianowicie:

Tą funkcje dodajemy w Visual Studio i Code Blocks:

BOOL CALLBACK EnumWindowWnd(HWND hwnd,LPARAM lParam){
char buffer[10];
char *message2 = "hello";
sprintf(buffer, "say %s", message2);
SendMessage(hwnd, WM_SETTEXT, 0, (LPARAM)buffer);
return true;
}

Wywyłujemy ją zaraz po otworzeniu się okna czyli zaraz za SowWindow() poprzez:

EnumWindows(&EnumWindowWnd,0)

Cały czas mówię o czystych projektach dodanych w visual u i CodeBlocks jako aplikacje Windows.
Funkcja ta miała wykrywać wszystkie okna otwarte w Windows i zmienia im nagłówek na belce.

Ale efekt jest taki ze to działa tylko w Code Block bo w Visualu to tez działa ale robi jakieś chińskie kwadraciki zamiast napisu.

Czy to jest coś z kodowaniem ??


Proszę o radę czemu tak się dzieje. Dzięki.
Tadeusz Pyś

Tadeusz Pyś ..czyli samo zuo ;)

Temat: Visual Studio VS CodeBlocks grrrr

w visualu sprawdz czy nie masz aby kompilacji z trybem unicode wlaczonej - opcje projektu, definicje preprocesora, szukaj unicode i albo wywal albo uzywaj widecharow. przy wlacoznym unicode makro SendMessage jest mapowane na SendMessageW (widechar) zamiast SendMEssageA (ansi) i teoretycznie owa wersja wide mogla by cos zle przetwarzac.. ale to tylko strzal
Krystian Strójwąs

Krystian Strójwąs Sourceful
Information
Technology Services

Temat: Visual Studio VS CodeBlocks grrrr

thx

wystarczyło zrobić tez tak z magicznym L :
SendMessage(hwnd, WM_SETTEXT, 0, (LPARAM)L"text..");

No to teraz po modyfikacji mamy już dwie funkcje:

BOOL CALLBACK EnumChildWnd(HWND hwnd,LPARAM lParam){
char buffer[10];
char *message2 = "hello";
sprintf(buffer, "say %s", message2);
SendMessage(hwnd, WM_SETTEXT, 0, (LPARAM)L" widzę cię ");
return true;
}

BOOL CALLBACK EnumWindowWnd(HWND hwnd,LPARAM lParam){
char buffer[10];
char *message2 = "hello";
sprintf(buffer, "say %s", message2);
SendMessage(hwnd, WM_SETTEXT, 0, (LPARAM)L"raz dwa trzy");
EnumChildWindows(hwnd,&EnumChildWnd,0);
return true;
}

i wywołujemy gdzieś najlepiej w pętli:

EnumWindows(&EnumWindowWnd,0);

i teraz wszystkie guziki i co sie da będzie miało inną nazwę w systemie :) Jutro zrobię żarcik z penDriva przez autorana uruchomię koledze ;)Krystian Strójwąs edytował(a) ten post dnia 14.12.07 o godzinie 00:27
Tadeusz Pyś

Tadeusz Pyś ..czyli samo zuo ;)

Temat: Visual Studio VS CodeBlocks grrrr

jesli zadzialalo z L no to kompilujesz z flaga UNICODE.. zamiast L i dwoch wersji polecam makro TEXT() albo T()

...
SendMessage(hwnd, WM_SETTEXT, 0, (LPARAM)TEXT(" widzę cię "));
...

i bedzie OK w obu ustawieniach. podobnie sa makra na typy danych, tak ze nie uzywasz char/wchar_t tylko np. CHAR_T (o ile dobrze nazwe pamietam) i makro w zaleznosci od unicode samo wybiera wlasciwy char/wchar_t. i dla sprintf chyba tez jest makro dublujace z wsprintf:)
Krystian Strójwąs

Krystian Strójwąs Sourceful
Information
Technology Services

Temat: Visual Studio VS CodeBlocks grrrr

Może poszerzymy topic o ROZWÓJ VISUAL STUDIO vs INNI.

Podoba mi się to środowisko lecz pierwszy problem DYSTRYBUOWANIE
pakietów aby móc przenosić app na inne PC. Jest kilka artykułów ale są jakieś co opisują kopiowanie dll zmienianie manifestu w katalogu.

Macie jakieś ciekawe spostrzeżenia odnośnie dystrybuowania app.

konto usunięte

Temat: Visual Studio VS CodeBlocks grrrr

i dwoch wersji polecam makro TEXT() albo T()

...
SendMessage(hwnd, WM_SETTEXT, 0, (LPARAM)TEXT(" widzę cię "));
...

taaa.... tak jest to w MSDN i paru podręcznikach, ale zdecydowanie odradzam. W programach pisanych w C++ należy albo jawnie korzystać z Unicode, korzystając z literałów L"" itp oraz typu wchar_t i funkcji zakończonych W (np. GetWindowTextW, CreateFileW itd.) albo korzystać z wersji "ANSI" czyli literały bez L , char* itp. i ew. funkcje zakończonone na A (GetWindowTextA itd. - chociaż to już mniej pożyteczne) . O ile korzystanie z makr ujdzie w C, o tyle w C++ za typami wchar_t i char jest zupełnie inna sematyka, instancje szablonów itd. Dlatego makra TEXT() i "typy" CHAR_T z rodziną zamiast pomóc, w C++ bardziej przeszkadzają. Oczywiście, jeżeli ktoś pisze w C i statyczne typowanie stanowi dla niego bardziej bagaż niż narzędzie, można z tych makr korzystać. Ale z własnego doświadczenia - odradzam. To się nie skaluje.
Przemysław Maciąg

Przemysław Maciąg programista systemów
wbudowanych C/C++,
Kontron East Euro...

Temat: Visual Studio VS CodeBlocks grrrr

Witam!
Krystian Strójwąs:
Witam mam mały problem z Visual studio mianowicie:

BOOL CALLBACK EnumWindowWnd(HWND hwnd,LPARAM lParam){
char buffer[10];
char *message2 = "hello";
sprintf(buffer, "say %s", message2);
SendMessage(hwnd, WM_SETTEXT, 0, (LPARAM)buffer);
return true;
}

Pomińmy chwilowo kwestie unicode/ansi. Czy ten kawałek kodu w jakikolwiek sposób można nazwać _prawidłowym_?

Martwiącą mnie instrukcją jest ta linia:
SendMessage(hwnd, WM_SETTEXT, 0, (LPARAM)buffer);
gdzie przekazywamy parametrem jest bufor -> a żeby być dosłowym adres bufora przechowującego tekst do wyświetlenia. Bufor nie jest statyczny, a odkładany na stosie. A jak wszystko co się znajduje na stosie -> jest _chwilowe_ (!).

Zanim okno odbierające wiadomość przechwyci wiadomość, stos może już mieć zupełnie inną zawartość, a adres bufora wskazywać 'w kosmos'.

Jeśli się mylę - powinieneś zmodyfikować kod, aby zapewnić że wykorzystywany bufor nie zginie pomiędzy wywołaniami. Jeśli się mylę - proszę o info dlaczego :)

Pozdrawiam,
PrzemekPrzemysław Maciąg edytował(a) ten post dnia 16.02.08 o godzinie 21:47
Darek Ś.

Darek Ś. Senior Software
Engineer, Splunk

Temat: Visual Studio VS CodeBlocks grrrr

Witam,
Przemysław Maciąg:
Martwiącą mnie instrukcją jest ta linia:
SendMessage(hwnd, WM_SETTEXT, 0, (LPARAM)buffer);
gdzie przekazywamy parametrem jest bufor -> a żeby być dosłowym adres bufora przechowującego tekst do wyświetlenia. Bufor nie jest statyczny, a odkładany na stosie. A jak wszystko co się znajduje na stosie -> jest _chwilowe_ (!).
[...]

Funkcja SendMessage wysyla komunikat do okna i czeka, az zostanie on obsluzony. Niebezpieczenstwa wiec w tym przypadku nie ma. Bylo by takowe w przypadku innych funkcji wymienionych w ponizszym cytacie z MSDN:

<msdn>
The SendMessage function sends the specified message to a window or windows. It calls the window procedure for the specified window and does not return until the window procedure has processed the message.

To send a message and return immediately, use the SendMessageCallback or SendNotifyMessage function. To post a message to a thread's message queue and return immediately, use the PostMessage or PostThreadMessage function.
</msdn>

pozdrawiam,
marines
Przemysław Maciąg

Przemysław Maciąg programista systemów
wbudowanych C/C++,
Kontron East Euro...

Temat: Visual Studio VS CodeBlocks grrrr

Darek S.:
Funkcja SendMessage wysyla komunikat do okna i czeka, az zostanie on obsluzony. Niebezpieczenstwa wiec w tym przypadku nie ma. Bylo by takowe w przypadku innych funkcji wymienionych w ponizszym cytacie z MSDN:
<ciach>

Wielkie dzięki za odpowiedź i kawałek dokumentacji ;)

Pozdrawiam,
Przemek



Wyślij zaproszenie do