[WINAPI] Do czego jest użyte SendMessageTimeout

0

Witam, w ramach nauki przeglądam kod opens. UVNC i natrafiłem w nim na kilka globalnych :

// Constants
const UINT MENU_ADD_CLIENT_MSG = RegisterWindowMessage("WinVNC.AddClient.Message");
const UINT MENU_AUTO_RECONNECT_MSG = RegisterWindowMessage("WinVNC.AddAutoClient.Message");
const UINT MENU_REPEATER_ID_MSG = RegisterWindowMessage("WinVNC.AddRepeaterID.Message");
// adzm 2009-07-05 - Tray icon balloon tips
const UINT MENU_TRAYICON_BALLOON_MSG = RegisterWindowMessage("WinVNC.TrayIconBalloon.Message");
 
// Ten mnie intryguje 
const UINT FileTransferSendPacketMessage = RegisterWindowMessage("UltraVNC.Viewer.FileTransferSendPacketMessage");

Następnie w innym pliku programu (odpowiedzialnym za transfer plików) jest kod:

SendMessageTimeout( ft->m_pCC->m_hwndMain, FileTransferSendPacketMessage, (WPARAM) 0, 
                       (LPARAM) 0, SMTO_ABORTIFHUNG,500,(PDWORD_PTR)&Result);

  1. Nie wiem jaką dokładnie rolę ma spełniać tutaj polecenie SendMessageTimeuot(...) z tym dziwnym rejestrem komunikatu FileTransferSendPacketMessage?

  2. Na czym polega rejestracja komunikatu :

const UINT FileTransferSendPacketMessage = RegisterWindowMessage("UltraVNC.Viewer.FileTransferSendPacketMessage");
0

The function calls the window procedure for the specified window and, if the specified window belongs to a different thread, does not return until the window procedure has processed the message or the specified time-out period has elapsed. If the window receiving the message belongs to the same queue as the current thread, the window procedure is called directly—the time-out value is ignored.

Źródło: https://msdn.microsoft.com/en-us/library/windows/desktop/ms644952(v=vs.85).aspx

SendMessageTimeout( ft->m_pCC->m_hwndMain, FileTransferSendPacketMessage, (WPARAM) 0, 
                       (LPARAM) 0, SMTO_ABORTIFHUNG,500,(PDWORD_PTR)&Result);

po prostu do WndProc okna wysyła komunikat FileTransferSendPacketMessage, a jeśli okno jest w innym wątku, to próbuje aż do czasu określonego w przedostatnim argumencie.

const UINT FileTransferSendPacketMessage = RegisterWindowMessage("UltraVNC.Viewer.FileTransferSendPacketMessage");

To jest rejestrowanie komunikatu, więcej tutaj: https://msdn.microsoft.com/pl-pl/library/windows/desktop/ms644947(v=vs.85).aspx

0

Dziekuje.

Tylko dlaczego komunikat jest tej treści :

RegisterWindowMessage( "UltraVNC.Viewer.FileTransferSendPacketMessage");

Rozumiem , ze gdyby komunikat mówił np. zwiększ czcionkę, popraw coś tam, zamknij itd, a tutaj jest to zwykły łańcuch.
Czy to jest sposób przekazywania informacji do innego procesu /wątku , że w ramchc procedury FileTransfer trwa ( lub zacznie się) wysyłanie bloku pliku?

0

Funkcja RegisterWindowMessage gwarantuje że komunikat będzie miał unikalny numer na podstawie podanego jako parametr ciągu znaków i równie dobrze by było gdybyś tam podał PoCoCzytacHelpaJakJestForm jeżeli w innej aplikacji ten ciąg będzie taki sam to funkcja zwróci ten sam numer komunikatu. Dlatego jeżeli mamy zamiar komunikować się inną (innymi) aplikacjami przez wysyłanie do nich komunikatów i zamiast używać uchwytu konkretnego okna podając HWND_BROADCAST powinniśmy zadbać o to aby ten ciąg był unikalny dla naszych aplikacji po to aby jakaś inna aplikacja przypadkowo nie dostała tego komunikatu.

0

Bardzo dziękuje za uwagę ale nie o to pytałem. To, że jest unikalny ID itd. to pisze o tym MSDN.
Nie rozumiałem dlaczego w ogóle jest taki kruczek , że rejestruje sie unikalny komunikat , który jest zwykłą nazwą czegoś tam, nic nie robi i czemu to w ogóle ma służyć?
Mój wniosek jest taki: ten komunikat ma tylko służyć natychmiastowemu wywołaniu konkretnej funkcji z innego głównego procesu/wątku , tak by wywołana funkcja wykonała to czego oczekujemy. Gdyby wywołać ją w tradycyjni sposób , to wątek/proces główny by decydował kiedy ją ostatecznie wykona - tzw. proces synchroniczny.
A tak ślę z poziomu innego wątka do głównej procedury ten komunikat:

SendMessageTimeout( ft->m_pCC->m_hwndMain, FileTransferSendPacketMessage, (WPARAM) 0, 
                       (LPARAM) 0, SMTO_ABORTIFHUNG,500,(PDWORD_PTR)&Result);

a w wątku głównym w warunku identyfikującym ten komunikat wywołuję interesującą mnie funkcję:

if ((iMsg == FileTransferSendPacketMessage) 
{
     SendFileChunk();
}

W ten sposób uzyskuję asynchroniczność.

0

Nie rozumiałem dlaczego w ogóle jest taki kruczek , że rejestruje sie unikalny komunikat , który jest zwykłą nazwą czegoś tam, nic nie robi i czemu to w ogóle ma służyć?

Do komunikacji pomiędzy oknami - czy to w ramach jednego procesu czy nawet osobnych.

Oczywiście można to samo osiągnąć innymi sposobami.

0

Jakimi ?

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