2013-06-04 139 views
2

一直试图从我的Visual Studio C++应用程序调用Truecrypt exe,但CreateProcess只是不工作。 GetLastError()显示127
其目标是调用exe 而不显示命令窗口。请帮忙。我试过搜索并阅读CreateProcess parameter explanation使用CreateProcess调用exe文件?

#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(); 
} 

回答

2

好的,最终在从文档中尝试了很多标志后破解了它。希望对任何与之相关的人都有所帮助。

#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的图形用户界面将显示出来,但其他一些exe文件的,你可以尝试将启动,但窗口将不可见。尽管你可以在TaskManager中看到应用程序。

0

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

STARTUPINFO si = {sizeof(STARTUPINFO)}; 

而且,你不检查CreatePipe失败的结果。

+0

'CreatePipe'工作正常。它们返回1.设置'STARTUPINFO'的大小是在'memset(&si,0,sizeof(si));'中完成的。我也尝试过你的技术,但它不起作用。需要帮忙。 – Nav

+0

@Nav:不,您的memset()行会将整个结构清零。斯科特告诉你,第一个成员(cb)需要自己包含sizeof(STARTUPINFO)。 –

+0

@Drew:我在memset后注释了他的代码。仍然没有工作。 – Nav

相关问题