Execl(2016) からCppで作成したアプリ(32bit)へ PostMessage したいのですができません。
PostMessage の戻り値が FLASE となり LastError の番号は 87(ERROR_INVALID_PARAMETER)となってしまいます。
宛先ウインドウハンドルは受け取り側のアプリで画面上に表示させそれをExcel側で使用しています。
Declare Function の定義も間違っていないと思うのですがなぜPostMessageが失敗してしまうのでしょうか?
(Excelの64bit/32bitとも失敗します)
VB
1Option Explicit 2#If VBA7 And Win64 Then 3Declare PtrSafe Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As LongPtr, ByVal wMsg As Long, ByVal wParam As LongPtr, ByVal lparam As LongPtr) As Long 4#Else 5Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lparam As Long) As Long 6#End If 7 8Sub test1() 9 Const WM_APP As Long = &H8000 10 Dim glhWndMain As LongPtr 11 Dim wParam As LongPtr 12 Dim lParam As LongPtr 13 Dim ret As Long 14 wParam = 123 15 lParam = 456 16 glhWndMain = &HC0644 '<-- 宛先ウインド 17 ret = PostMessage(glhWndMain, WM_APP, wParam, lParam) 18 Debug.Print ret & " " & Err.LastDllError ' 0 87 (ERROR_INVALID_PARAMETER)となってしまう 19End Sub
受け取り側アプリは以下の様になっています。
CPP
1LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) 2{ 3 TCHAR buff[256]; 4 switch (message) 5 { 6 case WM_CREATE: 7 swprintf_s(buff, 256, _T("hWnd=%p"), (void*)hWnd); 8 SetWindowText(hWnd, buff); // キャプションにハンドル値16進表示 9 break; 10 case WM_APP: 11 swprintf_s(buff, 256, _T("wparam=%d lParam=%p"), (int)wParam, (void*)lParam); 12 MessageBox(hWnd, buff, NULL, MB_OK); 13 break; 14 ・・・ 15
CPPで作成した以下の送信アプリ(64bit/32bitとも)では問題なく送信できます。
CPP
1int main(int argc, char *argv[]) 2{ 3 if (argc > 1) { 4 HWND hwnd; 5 hwnd = (HWND)_strtoi64(argv[1], NULL, 16); 6 if(!PostMessage(hwnd, WM_APP, 123, (LPARAM)456)){ 7 printf("NG PostMessage\n"); 8 } 9 } 10 return 0; 11}
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/08/06 07:35
2018/08/06 07:41
2018/08/06 09:25
2018/08/06 09:27
2018/08/06 09:49