防止在自定义node.js构build中创build控制台窗口

我正在创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中失败。)
  • 在node.gyp中将SubSystem更改为2
  • 还要添加'EntryPointSymbol': 'wmainCRTStartup'到node.gyp。

这将生成一个不创建控制台窗口的node.exe。