掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
SendMessageのプロセス間通信でエラー (ID:147880)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
> 今までSendMessageA や FindWindowAしか使用したことがありませんでしたが、 > SendMessageW,FindWindowWを使用して希望の動作になることを確認しました。 FindWindowA の場合、Shift_JIS で表現できない文字列、たとえば Dim nihao As String = ChrW(&H4F60) & "好" Dim cubicMeter As String = ChrW(&H33A5) などが使われているウィンドウを処理することができません。 今回は A でも W でも動作させれらるとは思いますが、Win98 系向けの VB.NET アプリを作るわけでは無いのなら、A 系を採用するメリットは あまり無いと思います。 > ByVal wParam As Integer, _ Int32 型を採用されているようですが、WPARAM のサイズは 4バイト固定ではなく、Win16/Win32/Win64 環境で異なる事に注意してください。 WPARAM/LPARAM のサイズはポインターの幅であるため、本来は wParam/lParam 共に IntPtr で宣言されるべきものです。 さらに言えば、SendMessage の戻り値である LRESULT 型についても、 本来は IntPtr とすることが求められます。 ただし 32bit 環境でしか実行されない場合に限っては、 ByVal wParam As Integer を用いることもできます。 4 バイト幅の環境で動作することを保証したいのであれば、今回のコードを x86 ビルドにてコンパイルするようにしてください。AnyCPU でビルドするなら IntPtr 型で宣言する必要があります。 > If WH_WatchDog <> 0 Then これだと、Option Strict On モードでコンパイルが通らなくなります。 WH_WatchDog は Integer ではなく IntPtr なので、 比較するべきは 0 ではなく、IntPtr.Zero となります。 > cds.dwData = 0 これも同様の理由から、「cds.dwData = IntPtr.Zero」とすべきです。 > cds.cbData = len + 1 +1 している理由は何ですか? > Dim bytearry() As Byte = System.Text.Encoding.Default.GetBytes(txt) > Dim len As Integer = bytearry.Length String 型として lpData を用意するのであれば、COPYDATASTRUCT に <StructLayout(…)> で Charset 指定を明示した方が良いでしょう。 Encoding.Default なら Charset.Ansi を指定しておくようにします。 なお、COPYDATASTRUCT.lpData に格納するデータを Unicode 文字列とするか Shift_JIS 文字列とするかは、送信側と受信側で一致させておいてください。
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.