Step.1 FindWindow()找到运用程序主窗体的句柄
Step.2 SendMessage()发送WM_COPYDATA的消息给它
Step.3 接收消息处理

解决方案 »

  1.   


    var 申請的參數,指針,函數返回,發送消息等等都可以啊?
      

  2.   

    //发
    procedure TForm1.Button1Click(Sender: TObject);
    var
      vCopyDataStruct: TCopyDataStruct;
    begin
      vCopyDataStruct.lpData := PChar(Memo1.Text);
      vCopyDataStruct.cbData := Length(Memo1.Text);
      vCopyDataStruct.dwData := SizeOf(TCopyDataStruct);
      SendMessage(FindWindow('TForm2', nil), WM_COPYDATA, Handle, Integer(@vCopyDataStruct));
    end;//收
    procedure TForm2.WMCOPYDATA(var Msg: TWMCOPYDATA);
    var
      vBuffer: array[0..255]of Char;
      pBuffer: PChar;
    begin
      pBuffer := vBuffer;
      Caption := IntToStr(Integer(Msg.CopyDataStruct));
      CopyMemory(pBuffer, Msg.CopyDataStruct^.lpData, Msg.CopyDataStruct^.cbData);
      pBuffer[Msg.CopyDataStruct^.cbData] := #0;
      Memo1.Text := vBuffer;
    end;//vCopyDataStruct.lpData是数据的指针
    //vCopyDataStruct.cbData是数据的大小
      

  3.   

    //上面错了,应该是
    uses Messages;
      

  4.   

    dll中没有form,如何得到SendMessage(FindWindow('TForm2', nil), WM_COPYDATA, Handle, Integer(@vCopyDataStruct));
    中的Handle?
      

  5.   

    procedure WMCOPYDATA(var Msg: TWMCOPYDATA);如何声明?
      

  6.   

    //....
        procedure WMCOPYDATA(var Msg: TWMCOPYDATA); message WM_COPYDATA;
      public
    //....
      

  7.   

    搞定了,谢谢!
    给分!
    总结一下:
    //dll的项目名称为brsclick,要向主程序brs.exe发送消息//dll 发  
    uses
    ...Messages...
    ......
    procedure SendClickUrl(StrUrl: string);
    var
      vCopyDataStruct: TCopyDataStruct;
    begin
      vCopyDataStruct.lpData := PChar(StrUrl);    //StrUrl为发送的
      vCopyDataStruct.cbData := Length(StrUrl);
      vCopyDataStruct.dwData := SizeOf(TCopyDataStruct);
      if FindWindow(nil, 'brs') <> 0 then
      begin
        SendMessage(FindWindow(nil, 'brs'), WM_COPYDATA, LoadLibrary('brsclick'), Integer(@vCopyDataStruct));
      end;
    end;
    //exe收
    private
    procedure WMCOPYDATA(var Msg: TWMCOPYDATA);  message WM_COPYDATA;......procedure TfrmMain.WMCOPYDATA(var Msg: TWMCOPYDATA);
    var
      vBuffer: array[0..255] of Char;
      pBuffer: PChar;
    begin
      pBuffer := vBuffer;
      CopyMemory(pBuffer, Msg.CopyDataStruct^.lpData, Msg.CopyDataStruct^.cbData);
      pBuffer[Msg.CopyDataStruct^.cbData] := #0;
      application.MessageBox(vBuffer, vBuffer, 0);    //vBuffer为收到的
    end;