メッセージ通信がDelphi 10.4のIDEでは動作しません

111 views
Skip to first unread message

mbb...@ybb.ne.jp

unread,
Mar 14, 2022, 6:24:32 PM3/14/22
to radstu...@googlegroups.com
Tonboです。
いつもお世話になっています。

Delphi XE8のIDE上で動作していたメッセージ通信が、Delphi 10.4のIDEでは動作し
ません。
(反応がありあせん)
アドバイスよろしくお願いします。

【環境】
OS:Windows 10 Pro 20H2
Delphi 10.4 : Windows 32

【ソース】
Mr.XRAY様のHPで紹介頂いているものです。
色々な場面でありがたく使用させて頂いています。

1.送信側

{$WARNINGS OFF}

unit SenderUnit;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;

type
TSenderForm = class(TForm)
Button1: TButton;
Edit1: TEdit;
Label1: TLabel;
procedure Button1Click(Sender: TObject);
private
{ Private 宣言 }
public
{ Public 宣言 }
end;

var
SenderForm: TSenderForm;

implementation

{$R *.DFM}

procedure TSenderForm.Button1Click(Sender: TObject); var
hWindow : HWND;
CDS : TCopyDataStruct;
StrSend : String; //Delphi 2007以前ではWideStringにする
begin
//受取る側のウィンドウハンドル
hWindow := FindWindow('TReceivForm', nil);
if hWindow = 0 then exit;

StrSend := Edit1.Text;

CDS.dwData := 1234; //適当な値
CDS.cbData := (Length(StrSend) + 1) * SizeOf(Char);
CDS.lpData := Pointer(StrSend);

SendMessage(hWindow, WM_COPYDATA, Self.Handle, LPARAM(Addr(CDS))); end;

end.

2.受信側

{$WARNINGS OFF}

unit ReceiverUnit;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;

type
TReceivForm = class(TForm)
Edit1: TEdit;
Label1: TLabel;
protected
procedure WMCopyData(var Message: TWMCopyData); message WM_COPYDATA;
private
{ Private 宣言 }
public
{ Public 宣言 }
end;

var
ReceivForm: TReceivForm;

implementation

{$R *.DFM}

procedure TReceivForm.WMCopyData(var Message: TWMCopyData); var
S : String;
begin
if Message.CopyDataStruct.dwData = 1234 then begin
S := PChar(Message.CopyDataStruct.lpData);
Edit1.Text := S;
end;
end;

end.

【不具合現象】
〇受信側をIDE上で実行する。
 送信側をEXEで実行し、Button1を押しても受信側は無反応。
〇XE8では、IDE上で受信する。

よろしくお願いいたします。


Tarou Takagi, Imageom

unread,
Mar 14, 2022, 7:35:30 PM3/14/22
to radstu...@googlegroups.com
イマジオムの高木です。 いつもお世話になっております。

Tonbo さん:
> Delphi XE8のIDE上で動作していたメッセージ通信が、Delphi 10.4の
> IDEでは動作しません。

 一つお伺いしたいのですが、受信側をIDE上で実行(デバッグ
実行)させるのでなく、.exe ファイルにして実行させる方法では
メッセージはうまく受信されますか?

 また送信側のプログラムを管理者として実行させるとどのように
なるでしょうか?

 ご存知かもしれませんが、Windows(Windows 7 以降)では、
非管理者権限で実行されているプログラムから、管理者権限で
実行されているプログラムにメッセージを送ることができません。
そのようなメッセージは、OSが黙って破棄してしまいます。
そのような仕様に関係があるような気がします。
――――――――――――――――――――――――――――――――――――
株式会社イマジオム 代表取締役 高木太郎
〒316-0024 茨城県 日立市 水木町 1-11-10
電話:0294-28-0147
ファクシミリ:0294-28-0148
携帯電話:090-8177-5709
メール:tarou_...@imageom.co.jp
ウェブサイト:
  (会社公式)https://www.imageom.co.jp/
  (イマジオム・アウトレット)https://www.imageom-outlet.shop/

Hikaru Fukushi

unread,
Mar 14, 2022, 10:44:03 PM3/14/22
to radstu...@googlegroups.com
Tonboさん、こんにちは。福士と申します。

> Delphi XE8のIDE上で動作していたメッセージ通信が、Delphi 10.4のIDEでは動作し
> ません。

> 【不具合現象】
> 〇受信側をIDE上で実行する。
>  送信側をEXEで実行し、Button1を押しても受信側は無反応。

手元の環境で提示されたコードを試してみましたが、特に問題なく
動作しますね。WM_COPYDATA受信処理に仕掛けたブレークポイントも
機能します。

検証した環境は以下の通りです。

Windows 10 Pro 21H1 (x64)
Delphi 10.4.2
ビルド構成: Debug
ターゲットプラットフォーム: Windows 32ビット

とすると考えられるのは高木さんの指摘するようにプログラムの
実行権限(整合性レベル/IL)の問題でしょうか。Windows Vista以降では
ILが自分より高いプロセスに対して働きかけができないようになって
います。ILは何もしないと基本的に子プロセスに対し継承されるため、
DelphiのIDEを管理者権限(IL=High)で実行していると、デバッグ実行
しているプログラムもまた管理者権限で実行されることとなり、
通常起動したプログラム(IL=Medium)からはWM_COPYDATAを送ることは
できない、ということになります。

---
東洋テクニカルシステム株式会社 システム開発部 福士 光
Hikaru Fukushi (Toyo Technical System Inc.)
mailto:fuk...@tts-inc.co.jp

mbb...@ybb.ne.jp

unread,
Mar 15, 2022, 12:25:11 AM3/15/22
to radstu...@googlegroups.com
高木さん
いつもお世話になっています。
早速のご返事ありがとうございました。

Delphi 10.4を監理者権限にしたまま確認しました。

>  受信側をIDE上で実行(デバッグ
> 実行)させるのでなく、.exe ファイルにして実行させる方法

これは同じく、無反応でした。

>  送信側のプログラムを管理者として実行させるとどのように
> なるでしょうか?

受信できました!

>  ご存知かもしれませんが、Windows(Windows 7 以降)では、
> 非管理者権限で実行されているプログラムから、管理者権限で
> 実行されているプログラムにメッセージを送ることができません。

いえ知りませんでした・・・
ご指摘の通りでした。
Delphi 10.4を、プロパティ/互換性から管理者権限を外すと、期待通りに
動作しました。
ありがとうございました。

永久に初心者から抜け出せません。

> ----- Original Message -----

mbb...@ybb.ne.jp

unread,
Mar 15, 2022, 12:39:46 AM3/15/22
to radstu...@googlegroups.com
福士様

Tonboです。
いつもありがとうございます。

わざわざ、当方と同じ Delphi 10.4.2でご確認いただきありがとうございました。

詳しい解説をありがとうございます。
ご指摘いただいたように管理者権限が問題でした。

XE8の管理者権限を見てみると、チェックが外れていました・・・
情けないです。

解決しました。ありがとうございました。

> ----- Original Message -----
Reply all
Reply to author
Forward
0 new messages