我试图在C ++中使用msdn function (CreateProcess)来运行应用程序。我没有得到任何错误,但是当我运行它时,它会崩溃。我所做的还注意到它创建了一个进程,但它没有运行它应该的文本文件。
我的代码:
#include <windows.h>
#include <iostream>
#include <string>
using namespace std;
void createPro ();
int main()
{
createPro();
}
void createPro () {
LPCTSTR lpApplicationName = "C:/Users/Andyy/Desktop/hello.txt";
LPSTARTUPINFO lpStartupInfo;
LPPROCESS_INFORMATION lpProcessInfo;
memset(&lpStartupInfo, 0, sizeof(lpStartupInfo));
memset(&lpProcessInfo, 0, sizeof(lpProcessInfo));
if (!CreateProcess(lpApplicationName,
NULL, NULL, NULL,
NULL, NULL, NULL, NULL,
lpStartupInfo,
lpProcessInfo
)
) {
cout << "Failed to create process" << lpApplicationName << endl;
}
cout << "Program exec: " << lpApplicationName << endl;
}
它创建了进程,但无法运行文本文件,并且编译器中没有显示错误。提前致谢。 返回错误:进程返回-1073741819(0xC0000005)
答案 0 :(得分:6)
CreateProcess
用于从可执行文件创建进程对象。您正在传递一个不是可执行文件的文本文件。据推测,您实际上是在尝试在默认文本编辑器中显示文本文件。使用ShellExecuteEx
来执行此操作。
除此之外,您不会在调用CreateProcess
时分配所需的两个结构。相反,你声明指向结构的指针,并保持指针未初始化。我希望这是访问冲突错误0xC0000005
的原因。为了将来参考,您将像这样分配和初始化这些结构:
STARTUPINFO StartupInfo = { sizeof StartupInfo };
PROCESS_INFORMATION ProcessInfo = { 0 };
然后将&StartupInfo
和&ProcessInfo
传递给CreateProcess
。当然,我只是为了完整性而添加这个建议。您将丢弃与CreateProcess
相关的所有代码并转而调用ShellExecuteEx
。