掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
SendMessageのプロセス間通信でエラー (ID:147877)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
> Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _ SendMessageA や FindWindowA ではなく、Declare Unicode Function で SendMessageW や FindWindowW を用いることをお奨めします。 (あるいは、Auto 指定を使う手もあります) Ansi 指定でも間違いでは無いのですが、Win98 等で動かすのでもなければ、 今更 A 系 API を呼び出す利点は無い気がします。 > ByVal lParam As COPYDATASTRUCT) As Integer WM_COPYDATA が求める lParam の型は、COPYDATASTRUCT のポインタです。すなわち、 (a案) COPYDATASTRUCT を Class として宣言し、ByVal で渡す。 (b案) COPYDATASTRUCT を Structure として宣言し、ByRef で渡す。 (c案) COPYDATASTRUCT 相当のバイナリの先頭アドレスを渡す。 などが求められるわけですが、現在のコードはいずれにも合致していません。 > Public Structure COPYDATASTRUCT API に渡す Class や Structure には、StructureLayout 属性を付与した方が安全です。 特に String をメンバーに含む場合には、Charset も一緒に指定しましょう。 > Public Structure COPYDATASTRUCT > Public dwData As Integer > Public cbData As Integer > Public lpData As String > End Structure COPYDATASTRUCT の本来の宣言は、下記のようになっています。 typedef struct tagCOPYDATASTRUCT { ULONG_PTR dwData; DWORD cbData; PVOID lpData; } COPYDATASTRUCT, *PCOPYDATASTRUCT; dwData は Integer ではなく、IntPtr とするのが正しいです。 dwData のサイズは、Win32 と Win64 で異なることに注意してください。 また、lpData に渡せるデータは、文字列とは限りません。 汎用的にするなら、lpData As IntPtr として宣言しておき、 そこに文字列を渡す場合には、Marshal.StringToHGlobal〜 と Marshal.FreeHGlobal を使うようにします。 文字列しか渡さない場合は、lpData As String にすることも可能ですが、 その場合は、lpData に MarshalAs 属性を付与しておいた方が良いでしょう。 下記のスレッドも参照してみてください。 http://madia.world.coocan.jp/cgi-bin/VBBBS2/wwwlng.cgi?print+201205/12050001.txt
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.