Użyłem tak wParam, ale niestety to też nie jest prawidłowe hwnd, ponieważ nie dociera do NC. Zostanę przy GetProcess i MainWindowHandle, tylko pewnie przez użycie TCHARA nie rozpoznaje mi komunikatu.
A mógłbyś mi napisać jakby wyglądał ten kawałek jeśli zamiast TCHAR użyłbym CHAR lub WCHAR:
cds.dwData = ID_COPYDATA_PHOTODONE;
cds.cbData = sizeof(TCHAR) * (_tcslen(lpszString) + 1);
cds.lpData = (TCHAR*) lpszString;
Bo jak próbuję CHAR lub WCHAR to mam błędy przy _tcslen.
Jak próbuję TCHAR lpszString = _T("string") to mam błąd: "a value of type "const wchar_t *" cannot be used to initialize an entity of type "TCHAR". Niestety słabo znam C++, a ta poprzednia konstrukcja to gdzieś z jakiejś dokumentacji lub forum.
TCHAR lpszString = _T("string") ; - przypisujesz znakowi adres i jest to bez sensu choć w kompilacji c zamiast cpp by przeszło. Powinno być: TCHAR* lpszString = _T("string") ;
Z komunikatu wnioskuję, że kompilujesz z opcją unikodu i przy tym założeniu kod powyżej oznacza, że usiłujesz wysłać serwerowi string unikodu. Wszytko jest ok poza jednym lpszString jest starym dobrym stringiem c z czasów kiedy o unkodzie nikt nie słyszał a próbujesz udawać że jest typu wchar_t*
. lpszString zajmuje strlen(lpszString) bajtów, z drugiej strony _tcslen rozwija się do wcslen i traktując tablicę bajtów jak tablicę elementów wchar_t szuka zera. Najczęściej znajdzie go daleko za końcem prawdziwego stringa.
Masz coś takiego dla obu hipotetycznych wersji:
void ncsvSendMsgW( HWND clientHwnd, HWND servHwnd, DWORD cmd, const WCHAR* cmdStr )
{
COPYDATASTRUCT cds;
WCHAR *cs2 = _wcsdup(cmdStr);
if (!cs2) return;
cds.dwData = cmd; //e.g. ID_COPYDATA_PHOTODONE;
cds.cbData = sizeof(WCHAR) * (wcslen(cmdStr) + 1);
cds.lpData = cs2;
SendMessage(servHwnd, WM_COPYDATA, (WPARAM)clientHwnd, (LPARAM)&cds);
free(cs2);
};
void ncsvSendMsgA( HWND clientHwnd, HWND servHwnd, DWORD cmd, const CHAR* cmdStr )
{
COPYDATASTRUCT cds;
CHAR *cs2 = _strdup(cmdStr);
if (!cs2) return;
cds.dwData = cmd; //e.g. ID_COPYDATA_PHOTODONE;
cds.cbData = (strlen(cmdStr) + 1);
cds.lpData = cs2;
SendMessage(servHwnd, WM_COPYDATA, (WPARAM)clientHwnd, (LPARAM)&cds);
free(cs2);
};
void test_ansi(HWND clientHwnd, HWND servHwnd )
{
ncsvSendMsgA( clientHwnd, servHwnd, ID_COPYDATA_PHOTODONE, "komenda");
}
void test_unicodei(HWND clientHwnd, HWND servHwnd )
{
ncsvSendMsgW( clientHwnd, servHwnd, ID_COPYDATA_PHOTODONE, L"komenda");
}
clientHwnd to musi być okno które ma ten callback doczepiony jako procedure okienkową
servHwnd - to co tam znalazłeś polując na okno NC
Ponieważ w stringu polecenia mogą być nazwy plików, obstawiam, że serwer używa raczej unikodu. Inaczej trzeba byłoby nazwy np do utf8 konwertować przed włączeniem do polecenia.
Duplikacja do cs2 komend jest raczej tylko by kompilator był zadowolony. O ile pamiętam system nie zmienia bloku przekazywanego w cds.
Nie chciałem żebyś wchodził w meandry modyfikatora const czytając komunikaty kompilatora.
Edit:
Zastosowałem cytowanie małych wycinków kodu, bo gwiazdki się nie wyświetlają jako, że są tu meta-znakami. Dość to niefortunny wybór...