問個外部呼叫程式與程式間傳訊的問題 |
尚未結案
|
willchen
初階會員 發表:64 回覆:81 積分:29 註冊:2003-05-23 發送簡訊給我 |
|
RaynorPao
版主 發表:139 回覆:3622 積分:7025 註冊:2002-08-12 發送簡訊給我 |
引言: 最近試用SendMessage的方式來傳Application與Application的資料 也使用ShellExecute來呼叫執行檔,我把我的問題簡單的說一下好了 如下 A呼叫B起來執行,A傳訊息給B,但我發生一個問題是,A要怎麼知道B已經執行好了 (因為A要得到B的Handle值,使用FindWindow),所以常常會發生,B還沒執行好,但A卻因為B沒有執行好,就沒傳訊息給B,請問這要怎麼解決?? willchen 你好: (1)同樣的方法,在 A 把 B 叫起來執行以後,B 先主動 SendMessage 給 A,這 樣 A 就知道 B 已經 ready 了,此時 A 就可以把資料 SendMessage 給 B ( > > --
------
-- 若您已經得到滿意的答覆,請適時結案!! -- -- 欲知前世因,今生受者是;欲知來世果,今生做者是 -- -- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 -- |
willchen
初階會員 發表:64 回覆:81 積分:29 註冊:2003-05-23 發送簡訊給我 |
|
RaynorPao
版主 發表:139 回覆:3622 積分:7025 註冊:2002-08-12 發送簡訊給我 |
|
willchen
初階會員 發表:64 回覆:81 積分:29 註冊:2003-05-23 發送簡訊給我 |
1.也就是說,A利用ShellExecute把B呼叫起來,B會產生Handle值,然後A來判斷此
Handle值是否存在,當然這必須使用迴圈等待
2.因為基本上我是由A程式收資料,一但A程式收到資料(從別台電腦傳來),由其
中的資料中呼叫B來執行(B呼叫成功會使用SendMessage傳個訊息給A),B執
行完得到其結果也是利用SendMessage方式來傳回其執行結果,所以會變成B
會有SendMessage兩次的情況發生,這要怎麼實作才比較洽當??但包子哥你
上次給我的那個傳值的函式,可以在一個Form裡面宣告多個嗎? 例如
BEGIN_MESSAGE_MAP
MESSAGE_HANDLER(WM_COPYDATA,TMessage,ReceiveFromMM)
MESSAGE_HANDLER(WM_COPYDATA,TMessage,XXXXXXXXXXXXX)
END_MESSAGE_MAP(TForm) XXXXXXXX表宣告的Override函式 如此一來,一但Message觸發,程式怎麼知道呼叫哪個函式來執行??
|
RaynorPao
版主 發表:139 回覆:3622 積分:7025 註冊:2002-08-12 發送簡訊給我 |
引言: 1.也就是說,A利用ShellExecute把B呼叫起來,B會產生Handle值,然後A來判斷此 Handle值是否存在,當然這必須使用迴圈等待 2.因為基本上我是由A程式收資料,一但A程式收到資料(從別台電腦傳來),由其 中的資料中呼叫B來執行(B呼叫成功會使用SendMessage傳個訊息給A),B執 行完得到其結果也是利用SendMessage方式來傳回其執行結果,所以會變成B 會有SendMessage兩次的情況發生,這要怎麼實作才比較洽當??但包子哥你 上次給我的那個傳值的函式,可以在一個Form裡面宣告多個嗎? 例如 BEGIN_MESSAGE_MAP MESSAGE_HANDLER(WM_COPYDATA,TMessage,ReceiveFromMM) MESSAGE_HANDLER(WM_COPYDATA,TMessage,XXXXXXXXXXXXX) END_MESSAGE_MAP(TForm) XXXXXXXX表宣告的Override函式 如此一來,一但Message觸發,程式怎麼知道呼叫哪個函式來執行?? willchen 你好: 應該是不需要再另外寫一個 function 的,你的思考方向,也許可以往 struct 動手腳 (這裡指的 struct 也就是被傳送的資料結構),例如,可以把 struct 設計成以下這個樣子 typedef struct _MYDATA { char szA2B[64]; char szB2A[64]; BYTE bData[1024]; DWORD dwLen; } MYDATA, *PMYDATA; 當 A, B 之間在互傳資料的時候,都是傳送這個 struct,其中可以做變化的部 分就在 szA2B 及 szB2A,例如: 當 A 把 B 呼叫起來之後,B 如果 ready 的話 就先在 szB2A 裡面寫一個字串 "B is ready" (其他的變數不填),當 A 收到這 個 struct 以後,會先去讀這個 szB2A 就會明白這次傳送的只是一個 ACK,就 直接忽略 bData, dwLen 裡面的資料,接下來 A 已經知道 B ready 了,A 就可 以傳送一個新的 struct 給 B,其中也許在 szA2B 裡面寫 "This is data",而 bData 則是實際傳送的資料,dwLen 是指資料的長度 (以此例而言,不可以超過 1024,如果要更大的 Size,請自行調整 bData 陣列的宣告),當 B 收到這個 struct 以後,先檢查 szA2B 裡面寫什麼,當 B 發現這是資料,就會把資料由 bData (要配合 dwLen) 讀出並做處理,最後,當 B 處理完成以後,再另外新增 一個 struct,把處理好的資料放在 bData 裡面 (長度記在 dwLen),然後在 szB2A 裡面寫 "This is return data",當 A 收到以後.....同樣的道理,我就 不再多說了 (其中的字串可自行設計),這樣,明白了嗎?? > --
------
-- 若您已經得到滿意的答覆,請適時結案!! -- -- 欲知前世因,今生受者是;欲知來世果,今生做者是 -- -- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 -- |
willchen
初階會員 發表:64 回覆:81 積分:29 註冊:2003-05-23 發送簡訊給我 |
|
RaynorPao
版主 發表:139 回覆:3622 積分:7025 註冊:2002-08-12 發送簡訊給我 |
引言: 我有看過之前包子哥的Form傳值的講解,但裡面我比較不懂的是,傳Struct的地方 我看到Sender部份有宣告struct的資料型態,但Receiver那邊卻沒有,為何會這樣,請問包子哥的是,Struct的宣告必須要兩個都要宣告,也就是Sender與Receiver都要嗎??willchen 你好: 是的,不好意思,我之前那篇文章寫得不清楚,現在已經更正了,的確是要在 Sender 及 Receiver 端宣告同樣的 struct --
------
-- 若您已經得到滿意的答覆,請適時結案!! -- -- 欲知前世因,今生受者是;欲知來世果,今生做者是 -- -- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 -- |
willchen
初階會員 發表:64 回覆:81 積分:29 註冊:2003-05-23 發送簡訊給我 |
我晚上試了一下,發現有問題,但我不知道問題出在哪裡(沒辦法Debug)
不過我猜可能是我寫的方式有錯,我把程式Po出來好了
A程式
=============================================================
void __fastcall TForm1::ReceiveFromServerlet(TMessage &Message) { COPYDATASTRUCT *Receivedata=(COPYDATASTRUCT*)(Message.LParam); MYDATA S2MM_Message; memcpy(&S2MM_Message,Receivedata->lpData,Receivedata->cbData); if(S2MM_Message.szB2A=="Serverlet is ready") { MYDATA ms; //設定要傳送的參數 lstrcpy(ms.szA2B,"Argument"); memset(ms.szB2A,0,sizeof(ms.szB2A)); ms.Data=CS_Argument; ms.Data_len=CS_Argument.Length(); //End //傳值進去 COPYDATASTRUCT Send_Argument; Send_Argument.dwData=0; Send_Argument.cbData=sizeof(MYDATA); Send_Argument.lpData=&ms; //找Serverlet Windows HWND hWnd=FindWindow(NULL,CS_Servicename.c_str()); if(hWnd) { //傳送argument ShowMessage("OK"); SendMessage(hWnd,WM_COPYDATA,(WPARAM)Handle,(LPARAM)&Send_Argument); } } }B程式(收A傳過來的值) ==================================================================== void __fastcall TForm1::ReceiveFromMM(TMessage &Message) { COPYDATASTRUCT *ReceiveData=(COPYDATASTRUCT*)(Message.LParam); MYDATA ms; memcpy(&ms,ReceiveData->lpData,ReceiveData->cbData); if(ms.szA2B=="Argument") { Edit1->Text=ms.Data; } }Structure =================================================================== typedef struct __MYDATA { char szA2B[64]; //ack char szB2A[64]; //ack AnsiString Data; //DATA int Data_len; //Datalength } MYDATA,*PMYDATA; //END ==================================================================== 我用ShowMessage的方式,可以測得出來當B Form執行Form時,會送個訊息(Serverlet is ready)給A說B已經執行完成,但當A知道B執行完成之後,要傳送參數給B時,B卻沒有接到(ReceiveFromMM),這是什麼原因??還有使用Message觸發好像不能使用Step by Step查Bug |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |