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

时间:2014-03-26 06:21:06

标签: windows node.js winapi

我正在创建一个不应向用户显示控制台窗口的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'确实生效了),因此构建的二进制文件链接不正确。

2 个答案:

答案 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)

看来你必须:

  • common.gypi中注释掉'SubSystem': 1行。 (将其更改为2会导致构建在mksnapshot中失败。)
  • node.gyp
  • 中将SubSystem更改为2
  • 同时将'EntryPointSymbol': 'wmainCRTStartup'添加到node.gyp。

这会构建一个不会创建控制台窗口的node.exe。