3

为了避免与互操作服务纠缠(超出我的理解),我使用

spawnl(P_DETACH, MyPath, "MyProg.exe", 0);

生成一个 VS 非托管 C++ 命令行项目。(它通过制造商的 DLL 控制天文相机)。

我不需要也不想要一个窗口(我使用主 GUI 程序中的命名管道与 myprog.exe 交谈)。

从 GUI 中抑制窗口是微不足道的,但为了避免与编组问题(超出我的理解)纠缠不清,myprog.exe 必须是非托管的本机 C++ 命令行项目,而不是 CLI 项目。

有大量关于从批处理文件或 python 中抑制窗口的文献,在 windows 项目中关闭窗口是微不足道的,但这在这里都无关紧要。

我生成了分离的 myprog.exe,但这无关紧要。关闭控制台句柄执行正常,但不会关闭窗口。

关于如何永远不打开黑色屏幕 DOS 框,或者如何在不关闭 myprog.exe 的情况下关闭它的任何想法?

4

1 回答 1

1

尝试这样的事情:

#define WIN32_LEAN_AND_MEAN
#include <windows.h>

#include <stdio.h>

void system_error(char *name) {
// Retrieve, format, and print out a message from the last errror.
// The `name' that's passed should be in the form of a present tense
// noun (phrase) such as "opening file".
//
    char *ptr = NULL;
    FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER |
        FORMAT_MESSAGE_FROM_SYSTEM,
        0, GetLastError(), 0, (char *)&ptr, 1024, NULL);

    printf("\nError %s: %s\n", name, ptr);
    LocalFree(ptr);
}

PROCESS_INFORMATION p;

BOOL WINAPI die(DWORD reason) {
    TerminateProcess(p.hProcess, 1);
    return TRUE;
}

int main(int argc, char **argv) {

    STARTUPINFO s;

    memset(&s, 0, sizeof s);
    s.cb = sizeof(s);

    if (!CreateProcess(argv[1], argv[2], NULL, NULL, TRUE,
        DETACHED_PROCESS, NULL, NULL, &s, &p))
    {
        system_error("Spawning program");
        return 1;
    }

    SetConsoleCtrlHandler(die, TRUE);

    WaitForSingleObject(p.hProcess, INFINITE);
    return 0;
}
于 2013-07-06T03:11:12.027 回答