在没有窗口的情况下运行C++非托管控制台应用程序(而不是批处理文件)

3
为了避免与Interop服务(超出我理解范围)纠缠,我使用
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的情况下关闭它?

你可能应该标记为Windows以更清晰明了。 另外,听起来你更感兴趣的是一个服务。 - Taywee
1
降低级别并使用CreateProcessCREATE_NO_WINDOW进程创建标志和/或STARTF_USESHOWWINDOW以及SW_HIDESTARTUPINFO的适当位置?(这不是答案,因为我不知道它是否有效。) - zwol
@Taywee 我按照你的建议打了标签。 - zwol
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;
}

出于好奇,DETACHED_PROCESSCREATE_NO_WINDOW 之间到底有什么区别? - zwol
@Zack:老实说,我写这个(或类似的东西)已经很久了,我都不记得了。 - Jerry Coffin
这个MSDN上的链接(http://msdn.microsoft.com/en-us/library/windows/desktop/ms684863(v=vs.85).aspx)可以帮助你了解创建进程标志。 - Captain Obvlious
@CaptainObvlious:已经查看了——他们的描述并没有特别明显地说明区别(尽管我模糊的记忆是区别实际上相当大)。 - Jerry Coffin
从我阅读MSDN的内容来看,CREATE_NO_WINDOW 似乎是你想要的选项。它实际上跳过了为控制台应用程序创建窗口,而 DETACHED_PROCESS 只是意味着新进程不会继承其父进程的控制台窗口(并且保留了它自己创建新控制台窗口的可能性)。不过我可能完全错了,因为我还没有测试过我的解释。 - Cody Gray
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接