C++ 如何在c++;没有窗户

C++ 如何在c++;没有窗户,c++,powershell,C++,Powershell,我用它来调用powershell,但即使我使用CREATE_NO_窗口,这段代码也是我以前的system()调用的C&p。但它不起作用。 更新的代码(仍不工作): 首先是线路 LPWSTR command=(_TEXT("powershell.exe -Executionpolicy bypass -File \"%deploy%\\psscript.ps1\" -Filename psscript -Folderpath \"%HOMEDRIVE%\\deployment\"")); …有三

我用它来调用powershell,但即使我使用CREATE_NO_窗口,这段代码也是我以前的system()调用的C&p。但它不起作用。 更新的代码(仍不工作):

首先是线路

LPWSTR command=(_TEXT("powershell.exe -Executionpolicy bypass -File \"%deploy%\\psscript.ps1\" -Filename psscript -Folderpath \"%HOMEDRIVE%\\deployment\""));
…有三个严重问题:

  • LPWSTR
    是一个Microsoft宏,它扩展为
    wchar\u t*
    ,而初始值设定项则简化为一个文本,即
    常量
    字符数组。在C++ 98中已经删除了<代码> const (第一个C++标准),并且在C++ 11中被删除了->强>无效/ <强> >

  • \u TEXT
    是一个Microsoft宏,如果定义了宏符号
    \u UNICODE
    ,它会在文本中添加前缀
    L
    。它曾经是提供与Windows95兼容的方案的一部分,直到2000年引入Unicode层。在这个方案过时16年后,我们现在已经了,最重要的是,如果您不定义
    \u UNICODE
    ,您将得到一个编译错误,因为您没有按照要求在任何地方使用该方案

  • 字符串中的
    %HOMEDRIVE%
    是用于扩展环境变量的命令解释器语法。我不是100%确定,只有99.8%左右,但据我记忆所及,
    CreateProcess
    没有这个功能

类型问题(第一个要点)可以通过使用本地数组来修复,例如

wchar_t command[] = L"notepad.exe";
请注意,
CreateProcess
要求它是可写的。因此,即使使用接受原始声明的编译器,您也会在未定义行为中退出,代码可能会试图修改文本

通过在构造命令字符串之前扩展该变量,可以解决环境变量问题。为此,我将使用
std::wstring
。它有助于连接等


然后,电话

CreateProcess(NULL, command, NULL, NULL, NULL, CREATE_NO_WINDOW, NULL, NULL, NULL, NULL);
…为返回进程和线程句柄的参数以及指定启动信息的参数提供
NULL
。那是行不通的。阅读文档


小贴士:

  • 如果您在尝试
    CreateProcess
    时考虑到一些简单的任务,例如运行记事本,您可以学习如何以较少的工作量正确调用它

  • 您可能会发现
    ShellExecute
    ShellExecuteEx
    比基本的
    CreateProcess
    更可取(免责声明:我没有检查它们是否支持无窗口执行,但它们很可能支持)


  • 您是否尝试过使用
    -WindowStyle Hidden
    选项?是的,仍然不起作用。我发现了一个错误,之前有一个对powershell的system()调用。上面的代码甚至不起作用=/Initialization指针指向非-
    const
    ,从C++11开始,使用文本无效,该规则集管理该位。根据Microsoft的文档,提供0的
    CreateProcess
    参数中至少有两个不接受0,这是管理该位的规则集。一定要阅读文档。
    CreateProcess(NULL, command, NULL, NULL, NULL, CREATE_NO_WINDOW, NULL, NULL, NULL, NULL);