掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
VB.netとVB6間のSendMessageについて(移管) (ID:143293)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
> 詳しい回答ありがとうございます。 COPYDATASTRUCT の ByVal/ByRef の説明、あれで分かりますか? > 宣言した時点で、SendMessage絡みであちこちエラーがでました。 はい、そのままだとエラーが出るのは一応理解していますが、 それらの「暗黙の型変換」を修正した上で、XP で再確認できないか、という意味です。 これには、『何故 XP で ByVal COPYDATASTRUCT構造体のコードが動いていたのかが 理解できなかったので、もう一度検証してみて欲しい』という気持ちも含まれています。(^^; 強制はできませんけれど。 > HWNDは受信ソフトが起動しているときのみ0以外の値がとれているのを確認しました。 もちろん、0 でないことは当然として、その値が目的の Form のウィンドウハンドルと 同じ値であることを、念のために確認しておいてください、という意味です。 (Visual Studio 付属の spyxx.exe で確認するとか、VB6 側で Me.hWnd を表示させておくとか) > サイズも大丈夫そうでした。 限定条件下では、元のコードのままでも動作しますが(ByVal/ByRef 件の件は別として)、 結構危なっかしいソースだとは思いますよ。 (1) 今回は x86 ビルドなので Integer でも通用しますが、64bit として実行された場合、 dwData メンバーの箇所で 4 バイトのズレが生じることになります。 (2) cbData に TextBox1.Text.Length + 1 を指定するのも、本来は誤りです。 指定するのは「文字数」ではなく「バイト数」ですし、もしも +1 するのであれば、 文字列の末尾に、明示的に vbNullChar を付与しておかなければいけません。 (3) 構造体には StructLayout 属性を明示的に付与するようにしましょう。特に、 メンバーに文字列型を含む場合には、CharSet 指定も重要になってきます。 > VistaのUACを有効にすると動くようになりました。 あれ? UAC のチェックボックスって、既定で on になっているはずでは…? 『ユーザー アカウント制御 (UAC) を使ってコンピュータの保護に役立たせる』 http://windows.microsoft.com/ja-JP/windows-vista/How-do-I-change-the-behavior-of-the-User-Account-Control-message 保護モードや一般ユーザーモードで実行されているプロセスから、 管理者モードのプロセスに対して SendMessage した場合、 SendMessage 関数自体は成功したように見えますが(0が返される)、 そのメッセージは実際には破棄されてしまい、相手には届きません。 その意味においては、UAC が与える影響というものはありますが、 受信側を管理者モードで起動していたわけでは無いでしょうし、 そもそも UAC は、今回は無効に設定されていたのですよね…?
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2020 Takeshi Okamoto All Rights Reserved.