我在控制台应用程序Visual Studio中制作了C ++代码。我的问题是如何使最终exe在没有控制台的情况下运行(仅从任务管理器中看到的过程)
到目前为止,我所看到的解决方案都使控制台出现一秒钟,然后熄灭。我不要这个 根本不出现。
Visual Studio中是否有任何选项或标志可以做到这一点?(类似g ++中的-mwindows标志)
提前致谢
在Project Properties
上Configuration Properties
- > Linker
- >System
页,您需要设置的值SubSystem
来Windows (/SUBSYSTEM:WINDOWS)
。新控制台应用程序项目的默认值为Console (/SUBSYSTEM:CONSOLE)
,这将导致Windows在启动程序时分配新控制台或附加到父进程的控制台。
您还需要将main
功能更改为WinMain
。WinMain的签名是:
int CALLBACK WinMain(
_In_ HINSTANCE hInstance,
_In_ HINSTANCE hPrevInstance,
_In_ LPSTR lpCmdLine,
_In_ int nCmdShow)
{
// Your code here
}
通过上述方法,子控制台进程仍将创建控制台窗口。既然你要使用评论说popen
,你真的不能轻易使用电话的正常方式CreateProcess
使用SW_HIDE
。
您真正想要做的是将一个隐藏的控制台窗口附加到您的进程,并允许您的子进程继承它。这可能不是最好的代码,但这是一种实现方法:
// Allocates a hidden console window for this process. This console can be
// inherited by child console processes, preventing them from creating a
// visible console. Returns false if the attempt fails.
bool AllocHiddenConsole()
{
TCHAR command[] = _T("cmd.exe");
STARTUPINFO startupInfo{};
PROCESS_INFORMATION processInfo{};
startupInfo.cb = sizeof(startupInfo);
startupInfo.dwFlags = STARTF_USESHOWWINDOW;
startupInfo.wShowWindow = SW_HIDE;
if (!CreateProcess(NULL, command, NULL, NULL, FALSE,
CREATE_NEW_CONSOLE, NULL, NULL, &startupInfo, &processInfo))
{
return false;
}
bool attached = false;
for (int i = 0; i < 1000; i++)
{
if (AttachConsole(processInfo.dwProcessId))
{
attached = true;
break;
}
Sleep(10);
}
TerminateProcess(processInfo.hProcess, 0);
CloseHandle(processInfo.hProcess);
CloseHandle(processInfo.hThread);
return attached;
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句