C++ 我可以用wm_copydata模拟应用程序退出代码吗?

C++ 我可以用wm_copydata模拟应用程序退出代码吗?,c++,c++builder,C++,C++builder,我第一次在这里发帖 我已经用Borland C++构建了一个小应用程序,它通过一个商业第三方应用程序通过shell命令执行。然后,第二个应用程序等待,直到它从我的应用程序收到退出代码。我想做的是通过发送消息wm_copydata将“0”或“1”发送到第二个应用程序,以模拟退出代码。我这样做是因为我希望我的应用程序在不退出的情况下发送退出代码!这可能吗 问题在于,数据从未到达,也从未被第二个接收应用程序处理。实际上,我不确定第二个应用程序是否实现了处理wm_copydata消息的代码,我只是假设它

我第一次在这里发帖

我已经用Borland C++构建了一个小应用程序,它通过一个商业第三方应用程序通过shell命令执行。然后,第二个应用程序等待,直到它从我的应用程序收到退出代码。我想做的是通过发送消息wm_copydata将“0”或“1”发送到第二个应用程序,以模拟退出代码。我这样做是因为我希望我的应用程序在不退出的情况下发送退出代码!这可能吗

问题在于,数据从未到达,也从未被第二个接收应用程序处理。实际上,我不确定第二个应用程序是否实现了处理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;
    }
}

简言之:不,这是不可能的。WM_COPYDATA旨在将数据从一个应用程序传递到另一个应用程序,但两个应用程序都必须知道并使用此消息。此外,它们必须为其数据共享一个接口。它不是自动的,您不能假设它是自动的,因为进程退出代码和此消息是无关的,如果应用程序等待进程退出,为什么它应该接受WM_COPYDATA?如果它接受该信息,那么它的结构和用途是什么?。如果其他人认为您的应用程序接受WM_COPYDATA而不是命令行参数,则显示此图像。你用那种意思来处理信息吗

您可能需要的是Unix上可用的fork命令。Windows不提供此功能,您可以尝试使用NtCreateProcess模拟其行为,但这可能非常棘手,我不知道它如何与复杂的GUI集成


一个可能的解决方案是创建一些共享内存,将所有私有数据复制到那里,然后运行另一个进程。然后,第二个进程可以从共享内存中读取其状态,而第一个进程只是以适当的退出代码终止。

除了@Adriano所说的之外,生成的进程在不首先退出自身的情况下无法将退出代码返回到启动进程。这就是为什么它被称为退出代码的原因。在进程终止之前,Windows不会看到进程的退出代码。

感谢Adriano和Remy的回答。对于我们的实现,我们需要将数据发送回第二个商业应用程序,以便我的应用程序保持打开状态,等待用户反馈,同时第二个应用程序在收到数据后恢复执行。等待外部应用程序退出是我们的工作设置限制。我按照您的建议解决了这个问题,将数据保存到一个文件中,让商业应用程序在我的应用程序保持打开状态的同时读取文件内容以进行进一步处理。值得高兴的是,与其他进程间通信机制相比,使用文件交换数据的速度要慢得多,而且更容易暴露于外部各方。WM_COPYDATA可以很好地工作,或者您可以使用任何数量的其他机制,例如管道、套接字、邮件槽、ActiveX/COM、RPC等等。感谢您提及这些替代方案,因为除了管道之外,我不知道它们。你是对的,保存和读取外部文件很慢,但它目前正在工作。。。