質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

1回答

9947閲覧

Excel VBA で PostMessage できない

menshan

総合スコア54

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2018/08/06 05:12

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}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

VBAのLong型は4バイトとなってるようです

データ型の概要

LongLong にしてみてはどうでしょう

投稿2018/08/06 05:21

y_waiwai

総合スコア87719

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

menshan

2018/08/06 07:35

早速のご回答ありがとうございます。 Windows API の仕様を再確認しました。 BOOL PostMessage( HWND hWnd, // ポスト先ウィンドウのハンドル UINT Msg, // メッセージ WPARAM wParam, // メッセージの最初のパラメータ LPARAM lParam // メッセージの 2 番目のパラメータ ); パラメータのサイズは以下の様になっていて 32bit 64bit HWND 4 8 UINT 4 4 WPARAM 4 8 LPARAM 4 8 Excel 64bit だとDeclare宣言の上の文が使われ、32bit だと下の文が使われるので Windows API の仕様と矛盾はしていないと思うのですが・・・
y_waiwai

2018/08/06 07:41

そこを全部8にしてやってみてどうなるかを確かめてみては
menshan

2018/08/06 09:25

Declare PtrSafe Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As LongLong, ByVal wMsg As Long, ByVal wParam As LongLong, ByVal lparam As LongLong) As Long にしてやってみましたが結果は変わりませんでした。
y_waiwai

2018/08/06 09:27

Declare PtrSafe Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As LongLong, ByVal wMsg As LongLong, ByVal wParam As LongLong, ByVal lparam As LongLong) As Long ではどうでしょう
menshan

2018/08/06 09:49

こちらもやってみましたが同じ結果でした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問