討論區快速選單
知識庫快速選單
程式設計俱樂部Facebook粉絲團 政府補助!學嵌入式+物聯網 傑米的攝影旅遊筆記
[ 回上頁 ] [ 討論區發言規則 ]
兩個獨立執行檔互相溝通的問題
更改我的閱讀文章字型大小
作者 : supermai(燈燈)
[ 貼文 29 | 人氣 7831 | 評價 10 | 評價/貼文 0.34 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2003/9/24 上午 10:51:17
各位大大~
假設我現在有2個獨立的程式(並非是副程式)..
一個程式負責抓取檔案的路徑並將取得的檔案路徑傳給另外一個程式..
請問有沒沒有什麼方法可以讓這2個程式做"溝通"~
    
另外想請問一下dll這種程式是在做什麼的..
能否達到我的要求呢..還是有別的方法..
煩請各位大大解惑一下~
作者 : tuxedomask(善之天使)
[ 貼文 159 | 人氣 528 | 評價 60 | 評價/貼文 0.38 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2003/9/24 下午 12:29:23
方法1
GetWindow and PostMessage
方法2
CreateFileMapping
方法3
TCPIP

看用途選一個
作者 : supermai(燈燈)
[ 貼文 29 | 人氣 7831 | 評價 10 | 評價/貼文 0.34 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2003/9/24 下午 01:04:55

>方法1
>GetWindow and PostMessage
>方法2
>CreateFileMapping
這位大大...能不能請你解釋一下上述2種方法呢..
我都沒有用過也不知道該如何用...
或是能給我一些sample麼 ~謝謝你的回答~^^

>方法3
>TCPIP
作者 : ghost_liao(ghost) 貼文超過200則人氣指數超過10000點
[ 貼文 367 | 人氣 13998 | 評價 1230 | 評價/貼文 3.35 | 送出評價 94 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2004/7/8 下午 11:50:50
第一個問題
可以使用共享記憶體的方式來解決
第二個問題
若有需要maile給我
superjoeliao@yahoo.com.tw
作者 : nietzsche(尼采) VC++優秀好手C++優秀好手貼文超過500則
[ 貼文 501 | 人氣 3089 | 評價 2900 | 評價/貼文 5.79 | 送出評價 5 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2004/7/9 上午 03:27:27
1.DLL可以做到,宣告一個共用的記憶體區塊就可以了....
2.用 FileMapping 是比較簡單一點的..
3.用 SendMessage() 更簡單,只有你有辦法亙相知道對方的 hwnd 就可以了..
作者 : akira32(Akira) VC++優秀好手DirectX優秀好手貼文超過2000則人氣指數超過350000點
[ 貼文 2527 | 人氣 384134 | 評價 3430 | 評價/貼文 1.36 | 送出評價 243 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2004/7/12 上午 12:14:37
FindWindow後再SendMessage
作者 : clarklee(clark)
[ 貼文 26 | 人氣 546 | 評價 0 | 評價/貼文 0 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2004/7/12 上午 12:48:33
1. FindWindow ---- 尋找要傳訊息的視窗
2. PostMessage --- 傳送訊息
3. GlobalAlloc ----- 路徑的訊息要配置成Global傳過去
作者 : snake_hsu(snake) 人氣指數超過10000點
[ 貼文 177 | 人氣 13157 | 評價 1020 | 評價/貼文 5.76 | 送出評價 26 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2004/7/18 下午 08:28:29
請問如果用 PostMessage 或 SendMessage 的話
那是不是要先自定一個 Message
那要先 RegisterWindowMessage ?
另外, 在 WndProc 是要用 WM_USER 來接收嗎 , 怎麼收到我自定的訊息
小弟還是新手 , 看 MSDN 裡講的不多 @@...
有沒有哪位大大可以幫小弟解釋一下, 最好有個範例啦
作者 : oneplay(天雲)
[ 貼文 73 | 人氣 3762 | 評價 360 | 評價/貼文 4.93 | 送出評價 2 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2004/7/18 下午 08:57:18
兩個執行檔都要Regist自定的Message,
如果是A要送給B, B就是一直不斷去收message Queue,
判斷是不是自定的message,
再將所跟的parameters拿來處理.
作者 : snake_hsu(snake) 人氣指數超過10000點
[ 貼文 177 | 人氣 13157 | 評價 1020 | 評價/貼文 5.76 | 送出評價 26 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2004/7/18 下午 08:57:34
哦...對了
我有試過 CreateFileMapping 的方式
用這個方法 , 需要透過 MapViewOfFile 來讀寫資料
而 MapViewOfFile 的值回值是 LPCvoid
小弟試過存 字串資料 的沒問題 , 可以 用(char*)來轉型 LPCvoid
但如果是要存 class 資料的話 ,
我該如何 把 class 資料 轉型 為 LPCvoid
然後又如何 從 LPCvoid 轉型為 class
因為直接轉型好像不行哩
作者 : snake_hsu(snake) 人氣指數超過10000點
[ 貼文 177 | 人氣 13157 | 評價 1020 | 評價/貼文 5.76 | 送出評價 26 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2004/7/18 下午 08:57:45
哦...對了
我有試過 CreateFileMapping 的方式
用這個方法 , 需要透過 MapViewOfFile 來讀寫資料
而 MapViewOfFile 的值回值是 LPCvoid
小弟試過存 字串資料 的沒問題 , 可以 用(char*)來轉型 LPCvoid
但如果是要存 class 資料的話 ,
我該如何 把 class 資料 轉型 為 LPCvoid
然後又如何 從 LPCvoid 轉型為 class
因為直接轉型好像不行哩
作者 : cplusplus(Cpp) C++優秀好手貼文超過500則人氣指數超過10000點
[ 貼文 846 | 人氣 16660 | 評價 1120 | 評價/貼文 1.32 | 送出評價 1 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2004/7/21 上午 01:55:47
恩 怎麼沒人提到用PIPE呢??
用PIPE應該不會很難~ 可以試試看囉
作者 : akira32(Akira) VC++優秀好手DirectX優秀好手貼文超過2000則人氣指數超過350000點
[ 貼文 2527 | 人氣 384134 | 評價 3430 | 評價/貼文 1.36 | 送出評價 243 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2004/7/25 下午 04:03:17
CWnd *pDisplayWnd = CWnd::FindWindow(NULL, "GM Tools");

    if (pDisplayWnd)
    {
     pDisplayWnd->SendMessage(WM_COPYDATA, 0, (LPARAM)&cds);
    }

作者 : gcl858(gcl858)
[ 貼文 29 | 人氣 8104 | 評價 0 | 評價/貼文 0 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2004/10/11 下午 08:29:44
我是用SendMessage(WM_COPYDATA...)的方式
但是遇到bcb寫的可以傳給vc但vc無法傳給bcbㄟ
請問有解嗎?
我目前是改用memory file的方式!!
作者 : c_s_h2002(kk)
[ 貼文 22 | 人氣 2069 | 評價 0 | 評價/貼文 0 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2004/10/14 上午 09:53:03
讀寫同一個INI 檔不是更簡單嗎?
作者 : chiuinan2(青衫)討論區板主 Visual C++ .NET卓越專家VC++一代宗師Visual Basic優秀好手資訊類作業求救卓越專家一般曠世奇才程式設計甘苦談優秀好手C++ Builder優秀好手上班族的哈拉園地優秀好手C++頂尖高手Assembly優秀好手貼文超過3000則人氣指數超過150000點
[ 貼文 3732 | 人氣 170106 | 評價 34520 | 評價/貼文 9.25 | 送出評價 125 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2004/10/14 下午 03:06:10
這個部份, 我不久前才寫過, 但後來用不著, 在檔案刪除前, 提供在這邊給你參考好了.

*** Client端 (發送訊息者):

static HWND Client_Window = NULL;
static HWND Server_Window = NULL;
static HANDLE Client_Memory_Handle = NULL;

LRESULT CALLBACK system_msg_proc(HWND hwnd, Uint message, WPARAM wparam, LPARAM lparam)
{
  return DefWindowProc(hwnd,message,wparam,lparam);
}


1.初始化

// 登錄window class
const char* client_name = "ClientWindow"; // 名稱請自定...
WNDCLASSEX wcex;
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = 0;
wcex.lpfnWndProc = (WNDPROC)system_msg_proc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = instance; // 請自行取得
wcex.hIcon = NULL;
wcex.hCursor = NULL;
wcex.hbrBackground = NULL;
wcex.lpszMenuName = NULL;
wcex.lpszClassName = client_name;
wcex.hIconSm = NULL;
RegisterClassEx(&wcex);
// 建立通訊視窗
Client_Window = CreateWindow(client_name,client_name,WS_POPUP | WS_CAPTION,0,0,0,0,NULL,NULL,instance,NULL);
if (Client_Window == NULL) 錯誤處理...
// 尋找Server視窗
const char* server_name = "ServerWindow"; // 名稱請自定
Server_Window = FindWindow(server_name,server_name);
if (Server_Window == NULL) 錯誤處理...

2.傳送訊息前建立共享記憶體

const char *filename = "ClientMemory";
int len = 資料長度
Client_Memory = CreateFileMapping(INVALID_HANDLE_VALUE,0,PAGE_READWRITE,0,len,filename);
if (Client_Memory == NULL) 錯誤處理
char* buffer = (char*)MapViewOfFile(Client_Memory,FILE_MAP_READ | FILE_MAP_WRITE,0,0,0);
if (buffer == NULL) 錯誤處理
將資料寫入buffer中
UnmapViewOfFile(buffer);
// 注意,寫完不能立即將共享記憶體close, 必須等Server端處理完後才能close

3.傳送並等待訊息

if (!PostMessage(Server_Window,WM_USER,額外參數,(long)m_DLL_Window)) 錯誤處理
// 以下等待的函數, 可另行再做Timeout的控制
for (;;)
{
  MSG msg;
  if (! PeekMessage(&msg,Client_Window,0,0,PM_REMOVE))
  {
    Sleep(50);
    continue;
  }
  if ((msg.hwnd == m_Client_Window) && (msg.message == WM_USER) &&
     (msg.lParam == (long)Server_Window))
  {
    接收到回傳訊息,加以處理
     將Client_Memory關閉
     break;
  }
  TranslateMessage(&msg);
  DispatchMessage(&msg);
}
作者 : chiuinan2(青衫)討論區板主 Visual C++ .NET卓越專家VC++一代宗師Visual Basic優秀好手資訊類作業求救卓越專家一般曠世奇才程式設計甘苦談優秀好手C++ Builder優秀好手上班族的哈拉園地優秀好手C++頂尖高手Assembly優秀好手貼文超過3000則人氣指數超過150000點
[ 貼文 3732 | 人氣 170106 | 評價 34520 | 評價/貼文 9.25 | 送出評價 125 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2004/10/14 下午 03:16:50
*** Server端

static HWND Server_Window = NULL;

1.初始化

const char *name = "ServerWindow"; // 名稱請自定
// 登錄window class
WNDCLASSEX wcex;
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = 0;
wcex.lpfnWndProc = (WNDPROC)system_msg_proc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = instance;
wcex.hIcon = NULL;
wcex.hCursor = NULL;
wcex.hbrBackground = NULL;
wcex.lpszMenuName = NULL;
wcex.lpszClassName = name;
wcex.hIconSm = NULL;
RegisterClassEx(&wcex);
// 建立通訊視窗
Server_Window = CreateWindow(name,name,WS_POPUP | WS_CAPTION,0,0,0,0,NULL,NULL,instance,NULL);
if (Server_Window != NULL) 錯誤處理

2. 訊息處理函數

LRESULT CALLBACK system_msg_proc(HWND hwnd, Uint message, WPARAM wparam, LPARAM lparam)
{
  switch(message)
  {
   case WM_USER:
     process_call(wparam,(HWND)lparam);
     break;
   default:
     return DefWindowProc(hwnd,message,wparam,lparam);
  }
  return 0;
}

void process_call(unsigned int wparam, HWND back_window)
{
  // 開啟共享記憶體加以處理
  const char* filename = "ClientMemory";
  HANDLE handle = OpenFileMapping(FILE_MAP_READ | FILE_MAP_WRITE,0,filename);
  if (handle == NULL) 錯誤處理
  char* buffer = (char*) MapViewOfFile(handle,FILE_MAP_READ | FILE_MAP_WRITE,0,0,0);
  if (buffer == NULL) 錯誤處理
  處理Client傳來的資料
  UnmapViewOfFile(buffer);
  CloseHandle(handle);
  // 回傳訊息給Client (註: 此處可以再建個Share Memory,將資料傳回給Client處理)
  PostMessage(back_window,WM_USER,額外參數,(long)Server_Window);
}

作者 : chiuinan2(青衫)討論區板主 Visual C++ .NET卓越專家VC++一代宗師Visual Basic優秀好手資訊類作業求救卓越專家一般曠世奇才程式設計甘苦談優秀好手C++ Builder優秀好手上班族的哈拉園地優秀好手C++頂尖高手Assembly優秀好手貼文超過3000則人氣指數超過150000點
[ 貼文 3732 | 人氣 170106 | 評價 34520 | 評價/貼文 9.25 | 送出評價 125 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2004/10/14 下午 03:31:08
前述的方法, 對於在同一login user下, 只有兩個程式溝通的情況下, 是可以work的, 而且效率上來講也還不錯. (註: 前面提到的用ini檔, 以及pipe, 在效率上都差很多, 而且錯誤處理上也會比較麻煩). 不過這個方法有幾個缺點:

1.多對一的情況下無法適用: 事實上, 可以採用Client在需要Server服務前, 先發送一個要求服務的訊息, 由Server給定一個handle, 做為後續使用共享記憶體名稱的依據, 而在之後Client對Server的呼叫, 都給定這個handle做為訊息參數. 這樣的處理也是能達到多對一的服務. (我原先寫的程式便是屬於這種)

2.不同login user下無法適用: 如果client是一個COM元件,由Web ASP程式啟動,很抱歉,你用FindWindow也無法找到Server的Window,因為兩者分屬不同的login user.

對於第2點, 我後來的解法便是採用tcp/ip的方式, 直接進行雙向溝通. 當server接收到client送來訊息時, 便啟動另一個執行緒去接收並處理, 以便隨時保持在listen的狀態下. 而為了避免在處理client服務時的多重執行緒reentry問題, 當每個執行緒接收資料完畢時, 便自動建一個物件, 然後以Window Message方式傳給主視窗處理, 隨即執行緒便結束. 主視窗訊息處理函數是屬單一執行緒, 前面各接收執行緒所丟出的訊息便在此"排隊"等待處理. 訊息處理後, 立即將處理結果透過connected socket傳回給client端. 目前驗證結果一切都ok, 效果很滿意.

採用tcp/ip通訊的另一個好處是, 兩個程式並不一定要在同一台機器. 如此擴展下去, 其實也可以達到分散式處理的架構.
作者 : badidu(BDD)
[ 貼文 135 | 人氣 9186 | 評價 290 | 評價/貼文 2.15 | 送出評價 13 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2004/10/15 下午 01:33:25

>前述的方法, 對於在同一login user下, 只有兩個程式溝通的情況下, 是可以work的, 而且效率上來講也還不錯. (註: 前面提到的用ini檔, 以及pipe, 在效率上都差很多, 而且錯誤處理上也會比較麻煩). 不過這個方法有幾個缺點:
>
>1.多對一的情況下無法適用: 事實上, 可以採用Client在需要Server服務前, 先發送一個要求服務的訊息, 由Server給定一個handle, 做為後續使用共享記憶體名稱的依據, 而在之後Client對Server的呼叫, 都給定這個handle做為訊息參數. 這樣的處理也是能達到多對一的服務. (我原先寫的程式便是屬於這種)
>
>2.不同login user下無法適用: 如果client是一個COM元件,由Web ASP程式啟動,很抱歉,你用FindWindow也無法找到Server的Window,因為兩者分屬不同的login user.
>
>對於第2點, 我後來的解法便是採用tcp/ip的方式, 直接進行雙向溝通. 當server接收到client送來訊息時, 便啟動另一個執行緒去接收並處理, 以便隨時保持在listen的狀態下. 而為了避免在處理client服務時的多重執行緒reentry問題, 當每個執行緒接收資料完畢時, 便自動建一個物件, 然後以Window Message方式傳給主視窗處理, 隨即執行緒便結束. 主視窗訊息處理函數是屬單一執行緒, 前面各接收執行緒所丟出的訊息便在此'排隊'等待處理. 訊息處理後, 立即將處理結果透過connected socket傳回給client端. 目前驗證結果一切都ok, 效果很滿意.
>
>採用tcp/ip通訊的另一個好處是, 兩個程式並不一定要在同一台機器. 如此擴展下去, 其實也可以達到分散式處理的架構.

同意...
走Socket或InetPub應該都不錯喔~~
作者 : still(still) 貼文超過200則人氣指數超過10000點
[ 貼文 342 | 人氣 14970 | 評價 490 | 評價/貼文 1.43 | 送出評價 9 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2006/2/25 上午 10:10:27
// pipe line 可能效率沒那麼好但是可以參考一下!
// 分開編譯後, 執行 progB.exe


//*****************
// progA.cpp
//*****************
#include <iostream>
// main program
int main(void)
{
std::cout<<"D:\\TestDir";

return 0;
}


//*****************
// progB.cpp
//*****************
#include <iostream>
using namespace std;
// main program
int main(void)
{
const int BUFFSIZE = 128;
char psBuffer[BUFFSIZE];
FILE *pPipe;

// open pipe line
if( (pPipe = _popen("progA", "rt")) == NULL )
return 0;
// get a line
fgets(psBuffer, BUFFSIZE, pPipe);
// output
cout<< psBuffer << endl;
// close pipe line
_pclose(pPipe);

system("pause");
return 0;
}
 板主 : 青衫 , Raymond
 > Visual C++ - 討論區
 - 最近熱門問答精華集
 - 全部歷史問答精華集
 - Visual C++ - 知識庫
  ■ 全站最新Post列表
  ■ 我的文章收藏
  ■ 我最愛的作者
  ■ 全站文章收藏排行榜
  ■ 全站最愛作者排行榜
  ■  月熱門主題
  ■  季熱門主題
  ■  熱門主題Top 20
  ■  本區Post排行榜
  ■  本區評價排行榜
  ■  全站專家名人榜
  ■  全站Post排行榜
  ■  全站評價排行榜
  ■  全站人氣排行榜
 請輸入關鍵字 
  開始搜尋
 
Top 10
評價排行
Visual C++
1 青衫 11070 
2 Raymond 10090 
3 Clier 7630 
4 小約翰 2500 
5 Cog 2030 
6 coco 1870 
7 aming 1410 
8 牧童哥 1400 
9 r2109 1380 
10 Akira 1350 
Visual C++
  專家等級 評價  
  一代宗師 10000  
  曠世奇才 5000  
  頂尖高手 3000  
  卓越專家 1500  
  優秀好手 750  
Microsoft Internet Explorer 6.0. Screen 1024x768 pixel. High Color (16 bit).
2000-2019 程式設計俱樂部 http://www.programmer-club.com.tw/
0.3896484