【问题标题】:Delphi IDE prevent sending messagesDelphi IDE 阻止发送消息
【发布时间】:2011-08-03 14:52:15
【问题描述】:

我有两个应用程序,它们与消息通信,如果我运行两个编译的 exe,一切都会按预期工作。但是当我从delphi ide(bds2006,尝试使用delphi 7 没有运气)运行(调试)发件人时,sendmessage 不会发送任何内容。

似乎 ide 阻止向其他应用程序发送消息。 我在 win7 64bit 和 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;

【问题讨论】:

    标签: delphi


    【解决方案1】:

    这是一个疯狂的猜测。您正在以管理员身份运行接收消息的应用程序。在 Vista 及更高版本中,完整性级别保护会阻止进程将消息传递给具有更高完整性级别的进程。

    来自SendMessage 文档:

    消息发送受制于 UIPI(用户界面特权隔离)。进程的线程只能向完整性级别较低或相等的进程中的线程的消息队列发送消息。

    【讨论】:

    • 其实情况正好相反,我以管理员身份运行exe(因为我的totalcommander是以管理员身份启动的),而调试器以普通用户身份运行...很好的猜测,谢谢。 :)
    • @Fabricio 我就知道你会这么说! ;-)
    • @David Heffernam:是的,这还记得 Raymond Chen 在他的博客中发表的关于心灵调试的帖子...... ;-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-06
    • 2021-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多