線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:4502
推到 Plurk!
推到 Facebook!

請問兩個軟體的溝通方法???

答題得分者是:dyming
liangyenchen
一般會員


發表:6
回覆:5
積分:2
註冊:2007-01-20

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-08-02 11:20:01 IP:59.120.xxx.xxx 訂閱
請問兩個軟體間的溝通方法有哪些?

例如A軟體的依個指令

可以讓B軟體秀出某個東西

前提是軟體已經都打開了

在未打開前 A可以用ShellExecuteEx等等的方式去開 B

再給B參數,讓B可以判斷開怎麼動作

請問在兩個軟體都開啟的狀態下 該怎麼做呢?

謝謝
ko
資深會員


發表:28
回覆:785
積分:444
註冊:2002-08-14

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-08-02 11:40:00 IP:61.30.xxx.xxx 訂閱
sendmessage or postmessage
可以去找相關資訊
------
======================
昏睡~
不昏睡~
不由昏睡~
dyming
初階會員


發表:0
回覆:11
積分:32
註冊:2003-04-21

發送簡訊給我
#3 引用回覆 回覆 發表時間:2007-08-02 18:14:27 IP:211.72.xxx.xxx 訂閱
我來說明一下好了, 應該很多人用的到. 程式 A.exe 要傳參數給 B.exe, 其中 B.exe 的 MainForm 叫 BMF (class name 就是 TBMF)

A 的程式段修改很簡單, 只要將參數準備好丟出即可.

const WM_A_B: WM_USER 100;

{$R *.DFM}

procedure TAMF.Button1Click(Sender: TObject);
var hApp: HWnd;
CopyData: TCopyDataStruct;
cParam: String;
begin
hApp := FindWindow(PChar('TBMF'),nil); //尋找 B 程式的 MainForm class name
if hApp <> 0 then
begin
cParam := '您要丟的參數內容,只能用一個字串,但可利用符號來區隔各參數';
CopyData.dwData:= WM_A_B;
CopyData.cbData := Length(cParam) 1; //number of bytes to transfer
CopyData.lpData := @cParam[1]; //pointer of the bytes to transfer
SendMessage(hApp, WM_COPYDATA, 0, LPARAM(@CopyData));
end;
end;


而 B 程式段修改如下:

unit Unit1;

interface

uses ....;

type
....
private
procedure WMCopyData(var Msg: TWMCopyData); //新增
message WM_CopyData; //新增
public
end;

var
BMF: TBMF; //B 程式的 MainForm name

const WM_A_B: WM_USER 100; //其它程式可依序用 101, 102 ... 來區別

{$R *.DFM}

//新增
procedure TBMF.WMCopyData(var Msg: TWMCopyData);
var cParam: String;
begin
with Msg.CopyDataStruct^ do
if dwData = WM_A_B then
begin
cParam := PChar(lpData); //cParam 就是 A 程式傳來的參數內容了, 當然利用符號區隔各參數時, 請自行解開
end;
end;


同理, B.exe 要丟參數給 A.exe 可延用 WM_A_B (這是 A 與 B 的悄悄話), 只要知道 A 程式的 MainForm class name 即可.
liangyenchen
一般會員


發表:6
回覆:5
積分:2
註冊:2007-01-20

發送簡訊給我
#4 引用回覆 回覆 發表時間:2007-08-14 18:03:02 IP:59.120.xxx.xxx 訂閱
請問一下用delphi 與 bcb做的軟體,這兩這可以用上面的方式溝通嗎?

我做了簡化,如下
delphi:
procedure TForm1.Button1Click(Sender: TObject);
var hApp: HWnd;
CopyData: TCopyDataStruct;
cParam: String;
begin
hApp := FindWindow(nil,'abcd');
if hApp <> 0 then
begin
SendMessage(hApp, WM_COPYDATA, 0, 0);
end;
end;



bcb:
void __fastcall TForm1::WndProc(Messages::TMessage &Message)
{
if( Message.Msg == WM_COPYDATA )
{
Edit1->Text = '0000';
TWMCopyData *msg = (TWMCopyData *)&Message;
MessageBox(0,0,"Oh!",MB_OK);
}
TForm::WndProc(Message);
}


實作發現bcb沒有反應

可以請大家幫忙嗎?
謝謝
系統時間:2017-10-24 15:52:42
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!