2012-06-13 103 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

相关问题