我正在创build一个不应该向用户显示控制台窗口的node.js自定义版本。
我已经尝试将gyp文件中的链接器configuration更改为2
(应该设置链接器标志 /SUBSYSTEM:WINDOWS
),但是当我运行生成的node.exe二进制文件时,仍然会看到一个控制台窗口。
我怎样才能防止出现控制台窗口?
编辑:进一步的调查显示node.gyp中的链接器configuration没有生效。 生成的node.vcxproj仍然有<Link><SubSystem>Console</SubSystem></Link>
(这对我来说很奇怪,因为'UACUIAccess': 'true'
的相同部分添加了'UACUIAccess': 'true'
),所以build立的二进制不正确地链接。
解决方案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
使用命令行工具静默启动一个进程: 安静 。
解决方案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);
看来你必须:
'SubSystem': 1
common.gypi中有 'SubSystem': 1
行。 (将其更改为2
会导致构建在mksnapshot中失败。) 2
'EntryPointSymbol': 'wmainCRTStartup'
到node.gyp。 这将生成一个不创建控制台窗口的node.exe。