2012-06-13 78 views
1

我第一次來這裏發表。我可以使用wm_copydata來模擬應用程序退出代碼嗎?

我已經用borland C++構建了一個小應用程序,它通過商業第三方應用程序的shell命令執行。這第二個應用程序然後等待直到它從我的應用程序接收退出代碼。我想要做的是發送'0'或'1'到第二個應用程序,通過發送消息wm_copydata來模仿退出代碼。我這樣做是因爲我希望我的應用程序無需退出即可發送退出代碼!這可能嗎?

問題是數據永遠不會到達,也不會被第二個接收應用程序處理。我實際上不確定是否第二個應用程序實現代碼來處理wm_copydata消息,我只是假設它...

感謝您的幫助,因爲我試圖建立一個應用程序,將不同供應商的不同軟件我們的部門。這裏是我正在使用的代碼:

void SendMyMessage(char* command) 
{ 
HWND Hamilton_Window_Handle; 
int len; 
char title[254]; 
AnsiString stemp; 
AnsiString hname = "HAMILTON RUN CONTROL"; 
Hamilton_Window_Handle = FindWindow(0,0); 
while (Hamilton_Window_Handle != 0) 
    { 
    len = GetWindowText(Hamilton_Window_Handle, title, 255); 
    stemp = UpperCase(title); 
    if (AnsiPos(hname, stemp) > 0) 
      {break;} 
    Hamilton_Window_Handle = GetWindow(Hamilton_Window_Handle, GW_HWNDNEXT); 
    } 

COPYDATASTRUCT cds; 
cds.dwData = 0; 
cds.cbData = strlen(command) +1; 
cds.lpData = command; 
SendMessage(Hamilton_Window_Handle, WM_COPYDATA, 0, (LPARAM)&cds); 
if(AnsiString(command) == "1") 
    { 
    Form1->Label1->Caption="Barcodes passed consistency check!"; 
    Form1->Label1->Font->Color = clGreen; 
    } 
else 
    { 

    Form1->Label1->Caption="Barcodes failed consistency check!"; 
    Form1->Label1->Font->Color = clRed; 
    } 
} 

回答

0

總之:不,這是不可能的。 WM_COPYDATA旨在將數據從一個應用程序傳遞到另一個應用程序,但兩個應用程序必須知道使用此消息。此外,他們必須共享一個接口作爲其數據。它不是自動的,你不能假定它的確如此,因爲進程退出代碼和這個消息是無關的(如果應用程序等待進程退出爲什麼它應該接受它?如果它接受那個消息,那麼結構和目的是什麼? )。如果其他人假設您的應用程序接受WM_COPYDATA而不是例如命令行參數,則爲圖像。你是否用這個意思來處理信息?

您可能需要的是在Unix上可用的fork()命令。 Windows不提供此功能,您可以嘗試使用NtCreateProcess()來模仿其行爲,但它可能非常棘手(我不知道它如何與複雜的GUI集成)。

一個可能的解決方案是創建一些共享內存,將所有私有數據複製並運行另一個進程。第二個進程然後可以從共享內存中讀取其狀態,而第一個進程只是以適當的退出代碼終止。

0

除了@Adriano所說的之外,如果沒有首先退出,產生的進程不能返回退出代碼到啓動進程。畢竟,這就是爲什麼它被稱爲退出代碼。 Windows在進程終止之前不會看到進程的退出代碼。

+0

感謝阿德里亞諾和雷米的答案。 對於我們的實現,我們需要將數據發送回第二個(商業應用程序),以便我的應用程序保持打開狀態,等待用戶反饋,同時第二個應用程序在接收數據後繼續執行。等待外部應用程序退出是因爲我們的工作設置是一個限制。我通過將數據保存到文件並使商業應用程序讀取文件內容以進行進一步處理,同時保持我的應用程序保持打開狀態,從而解決了問題。 乾杯, – Code850

+0

與其他進程間通信機制相比,使用文件交換數據要慢得多,並且更多地暴露給外部各方。 'WM_COPYDATA'可以工作得很好,或者你可以使用任何其他機制,比如管道,套接字,郵筒,ActiveX/COM,RPC等等。 –

+0

感謝您提及替代品,因爲除了管道之外,我並不知道它們。你是對的,保存和讀取外部文件很慢,但它現在正在工作...... – Code850

相關問題