我正在创建一个不应向用户显示控制台窗口的node.js的自定义构建。
我已尝试将linker config in the gyp file更改为2
(应设置链接器flag /SUBSYSTEM:WINDOWS
),但我在运行时仍会看到控制台窗口生成的node.exe二进制文件。
如何阻止出现控制台窗口?
编辑:进一步调查显示node.gyp中的链接器配置未生效。生成的node.vcxproj仍然有<Link><SubSystem>Console</SubSystem></Link>
(这对我来说很奇怪,因为在node.gyp的同一部分中添加'UACUIAccess': 'true'
确实生效了),因此构建的二进制文件链接不正确。
答案 0 :(得分:1)
解决方案1
将这一行文本另存为文件invisible.vbs:
CreateObject(“Wscript.Shell”).Run “”"” & WScript.Arguments(0) & “”"”, 0, False
要无形地运行任何程序或批处理文件,请按以下方式使用它:
wscript.exe “C:\Wherever\invisible.vbs” “C:\Some Other Place\MyBatchFile.bat”
还能够传递/中继参数列表,只使用两个双引号
CreateObject(“Wscript.Shell”).Run “” & WScript.Arguments(0) & “”, 0, False
例如:Invisible.vbs “Kill.vbs ME.exe”
解决方案2
使用命令行工具以静默方式启动流程:Quiet。
解决方案3
推出自己的C ++ Win32应用程序:
PROCESS_INFORMATION procInfo = {0};
STARTUPINFOstartupInfo = {0};
SECURITY_ATTRIBUTESsaAttr = {0};
HANDLEhStdIn = GetStdHandle(STD_INPUT_HANDLE);
HANDLEhStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
HANDLEhStdErr = GetStdHandle(STD_ERROR_HANDLE);
// build up security attributes
saAttr.nLength = sizeof(saAttr);
saAttr.bInheritHandle = TRUE;
saAttr.lpSecurityDescriptor = NULL;
// set file handles for process to be created
startupInfo.cb = sizeof(startupInfo);
startupInfo.dwFlags = STARTF_USESTDHANDLES;
startupInfo.hStdInput = hStdIn;
startupInfo.hStdOutput = hStdOut;
startupInfo.hStdError = hStdErr;
// build command line: format is [cmd.exe /c "%batchScript%" %batchArgs%]
if (-1 == _snprintf_s(cmd, sizeof(cmd),"cmd.exe /c \"%s\" %s", batchScript, batchArgs))
errorExit("_snprintf_s(\"cmd.exe /c \"%%s\" %%s\"), \"%s\", \"%s\") failed.", batchScript, batchArgs);
rc = CreateProcess(NULL, cmd, NULL, &saAttr, TRUE, CREATE_NO_WINDOW, NULL, tempPath, &startupInfo, &procInfo);
答案 1 :(得分:0)
看来你必须:
'SubSystem': 1
行。 (将其更改为2
会导致构建在mksnapshot中失败。)SubSystem
更改为2
'EntryPointSymbol': 'wmainCRTStartup'
添加到node.gyp。这会构建一个不会创建控制台窗口的node.exe。