Delphi IDE如何防止发送消息

6

我有两个应用程序,它们通过消息进行通信,如果我运行这两个编译后的exe,一切都按预期工作。但是当我从Delphi IDE(BDS2006,尝试了Delphi 7没有成功)运行(调试)发送者时,SendMessage不会发送任何东西。

看起来IDE阻止向其他应用程序发送消息。我在Win7 64位和Borland 2006上使用WM_COPYDATA。

有什么想法吗?

发送者:

procedure TForm1.Button1Click(Sender: TObject);
  var dst: THandle;
      stringToSend : string;
      copyDataStruct : TCopyDataStruct;
  begin
     stringToSend := 'Hello';
     copyDataStruct.dwData := 0; //use it to identify the message contents
     copyDataStruct.cbData := 1 + Length(stringToSend) ;
     copyDataStruct.lpData := PChar(stringToSend) ;
     SendData(copyDataStruct) ;
  end;

procedure TForm1.SendData(const copyDataStruct: TCopyDataStruct) ;
 var
   receiverHandle : THandle;
   res : integer;
 begin
   receiverHandle := findwindow( pchar('TForm2'), pchar('Form2') );
   if receiverHandle = 0 then
   begin
     ShowMessage('CopyData Receiver NOT found!') ;
     Exit;
   end;

   res := SendMessage(receiverHandle, WM_COPYDATA, Integer(Handle), Integer(@copyDataStruct)) ;

 end;
end.

接收器部分:
TForm2 = class(TForm)
  private
    procedure WMCopyData(var Msg: TWMCopyData ); message WM_COPYDATA;
  public
  end;

var
  Form2: TForm2;

implementation

{$R *.dfm}

{ TReceiver }


procedure TForm2.WMCopyData( var Msg: TWMCopyData );
  begin
    ShowMessage( 'Received' );
  end;
1个回答

11
这只是一个猜测。您可能正在以管理员身份运行接收消息的应用程序。在Vista和更高版本中,完整性级别保护会阻止进程向具有更高完整性级别的进程发送消息。
根据SendMessage文档:
消息发送受到UIPI(用户界面特权隔离)的限制。进程的线程只能向完整性级别较低或相等的进程的线程消息队列发送消息。

实际上情况恰好相反,我以管理员身份运行了exe文件(因为我的totalcommander是以管理员身份启动的),而调试器则是以普通用户身份运行的...非常好的猜测,谢谢。 :) - balazs
3
@Fabricio 我知道你会这么说的!;-) - David Heffernan
@David Heffernam:没错,那让人想起了 Raymond Chen 在他的博客中发布的“心灵调试”文章…;-) - Fabricio Araujo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接