【问题标题】:Using CreateProcess to invoke an exe file?使用 CreateProcess 调用 exe 文件?
【发布时间】:2013-05-30 19:23:27
【问题描述】:

尝试从我的 Visual Studio C++ 应用程序调用 Truecrypt exe,但 CreateProcess 无法正常工作。 GetLastError() 显示 127
目标是调用 exe 不显示命令窗口。请帮忙。我试过搜索并阅读CreateProcess parameter explanation

#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include<Windows.h>

int main( void )
{
    HANDLE StdInHandles[2]; 
    HANDLE StdOutHandles[2]; 
    HANDLE StdErrHandles[2]; 

    CreatePipe(&StdInHandles[0], &StdInHandles[1], NULL, 4096); 
    CreatePipe(&StdOutHandles[0], &StdOutHandles[1], NULL, 4096); 
    CreatePipe(&StdErrHandles[0], &StdErrHandles[1], NULL, 4096); 

    STARTUPINFO si;   memset(&si, 0, sizeof(si));  // zero out

    si.dwFlags =  STARTF_USESTDHANDLES; 
    si.hStdInput = StdInHandles[0];  // read handle
    si.hStdOutput = StdOutHandles[1];  // write handle 
    si.hStdError = StdErrHandles[1];  // write handle 
    PROCESS_INFORMATION pi; 
    std::cout<< CreateProcess("\"C:\\Program Files\\TrueCrypt\\cmd.exe\\TrueCrypt.exe\"", " //b" , NULL, NULL, FALSE, CREATE_NO_WINDOW , NULL, NULL, &si, &pi)<< "\n" << GetLastError() << "\n";
    std::cin.get();
}

【问题讨论】:

    标签: visual-c++ createprocess truecrypt


    【解决方案1】:

    好的,在尝试了文档中的很多标志后终于破解了它。希望它对其他挣扎于它的人有所帮助。

    #include<Windows.h>
    
    int main()
    {
        STARTUPINFO si = { sizeof(STARTUPINFO) };
        si.cb = sizeof(si);
        si.dwFlags = STARTF_USESHOWWINDOW;
        si.wShowWindow = SW_HIDE;
        PROCESS_INFORMATION pi;
        CreateProcess("C:\\Program Files\\Nero\\Nero 7\\Core\\nero.exe", NULL , NULL, NULL, FALSE, CREATE_NO_WINDOW , NULL, NULL, &si, &pi);
    }//main
    

    请注意,会显示 Nero 的 GUI,但您可能会尝试启动其他一些 exe,但该窗口将不可见。不过,您将能够在 TaskManager 中看到该应用程序。

    【讨论】:

      【解决方案2】:

      最可能的原因是您的 STARTUPINFO 结构。至少,您需要将 cb 成员设置为 sizeof(STARTUPINFO)。我喜欢这样做:

      STARTUPINFO si = {sizeof(STARTUPINFO)};
      

      另外,您没有检查CreatePipe 的结果是否失败。

      【讨论】:

      • CreatePipe 工作正常。他们返回 1。设置STARTUPINFO 的大小是在memset(&amp;si, 0, sizeof(si)); 中完成的。我也试过你的技术,但它不起作用。需要帮助。
      • @Nav:不,您的 memset() 行将整个结构归零。 Scott 告诉您,第一个成员 (cb) 本身需要包含 sizeof(STARTUPINFO)。
      • @Drew:我在注释掉memset 后尝试了他的代码。还是不行。
      • 好的,所以使用我发布的原始代码,当我像这样使用它时它可以工作:CreateProcess("C:\\Program Files\\Nero\\Nero 7\\Core\\nero.exe", NULL , NULL, NULL, FALSE, CREATE_NEW_CONSOLE , NULL, NULL, &amp;si, &amp;pi);。但是当我使用CreateProcess 时,仍然会创建命令窗口。即使我使用CREATE_NO_WINDOW 也无法摆脱它。救命!!!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-11
      相关资源
      最近更新 更多