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

問個外部呼叫程式與程式間傳訊的問題

尚未結案
willchen
初階會員


發表:64
回覆:81
積分:29
註冊:2003-05-23

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-10-21 22:44:32 IP:211.74.xxx.xxx 未訂閱
最近試用SendMessage的方式來傳Application與Application的資料 也使用ShellExecute來呼叫執行檔,我把我的問題簡單的說一下好了 如下 A呼叫B起來執行,A傳訊息給B,但我發生一個問題是,A要怎麼知道B已經執行好了 (因為A要得到B的Handle值,使用FindWindow),所以常常會發生,B還沒執行好,但A卻因為B沒有執行好,就沒傳訊息給B,請問這要怎麼解決??
RaynorPao
版主


發表:139
回覆:3622
積分:7025
註冊:2002-08-12

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-10-21 23:05:26 IP:61.221.xxx.xxx 未訂閱
引言: 最近試用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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-10-21 23:58:33 IP:211.74.xxx.xxx 未訂閱
那請問一下包子哥,可以使用Handle值的方法來實做嗎?? 這樣傳訊似乎有點麻煩
RaynorPao
版主


發表:139
回覆:3622
積分:7025
註冊:2002-08-12

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-10-22 08:50:34 IP:203.73.xxx.xxx 未訂閱
引言: 那請問一下包子哥,可以使用Handle值的方法來實做嗎?? 這樣傳訊似乎有點麻煩
willchen 你好:
(1)請問??「使用 Handle 值的方法來實做」是指什麼呢?? 是否能夠說得更清楚
   一點??
( >
    -- 
        
------
-- 若您已經得到滿意的答覆,請適時結案!! --
-- 欲知前世因,今生受者是;欲知來世果,今生做者是 --
-- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 --
willchen
初階會員


發表:64
回覆:81
積分:29
註冊:2003-05-23

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-10-22 13:54:57 IP:211.74.xxx.xxx 未訂閱
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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-10-22 14:42:53 IP:203.73.xxx.xxx 未訂閱
引言: 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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-10-23 16:38:07 IP:163.28.xxx.xxx 未訂閱
我有看過之前包子哥的Form傳值的講解,但裡面我比較不懂的是,傳Struct的地方 我看到Sender部份有宣告struct的資料型態,但Receiver那邊卻沒有,為何會這樣,請問包子哥的是,Struct的宣告必須要兩個都要宣告,也就是Sender與Receiver都要嗎??
RaynorPao
版主


發表:139
回覆:3622
積分:7025
註冊:2002-08-12

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-10-23 21:26:10 IP:61.221.xxx.xxx 未訂閱
引言: 我有看過之前包子哥的Form傳值的講解,但裡面我比較不懂的是,傳Struct的地方 我看到Sender部份有宣告struct的資料型態,但Receiver那邊卻沒有,為何會這樣,請問包子哥的是,Struct的宣告必須要兩個都要宣告,也就是Sender與Receiver都要嗎??
willchen 你好: 是的,不好意思,我之前那篇文章寫得不清楚,現在已經更正了,的確是要在 Sender 及 Receiver 端宣告同樣的 struct --
------
-- 若您已經得到滿意的答覆,請適時結案!! --
-- 欲知前世因,今生受者是;欲知來世果,今生做者是 --
-- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 --
willchen
初階會員


發表:64
回覆:81
積分:29
註冊:2003-05-23

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-10-23 23:49:38 IP:211.74.xxx.xxx 未訂閱
我晚上試了一下,發現有問題,但我不知道問題出在哪裡(沒辦法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
系統時間:2024-05-04 6:11:35
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!