我正在阅读c ++中的CreateProcess函数,我想尝试一下。代码的基本思想是让我的主要执行另一个进程(记事本)。真的,这只是基本代码。当我运行程序时,我得到:
createprocess.exe中0x752bb763处的第一次机会异常:0xC0000005:访问冲突写入位置0x00be57b8。
createprocess.exe中0x752bb763处的未处理异常:0xC0000005:访问冲突写入位置0x00be57b8。
当我为发生错误的位置设置一个断点时,我会被带到tidtable.c(我想这是用于访问线程)。
特别是在CRTIMP PFLS_GETVALUE_FUNCTION __cdecl __set_flsgetvalue()
的tidtable.c
我真的不知道是什么或如何避免这个问题。 CreateProcess调用发生错误(即,它永远不会输出“out of create”)。
我的代码是:
#include "stdafx.h"
#include <stdio.h>
#include <windows.h>
#include <strsafe.h>
#include <direct.h>
#include <string.h>
#include <conio.h>
int main(VOID)
{
STARTUPINFO si;
PROCESS_INFORMATION pi;
//allocate memory
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
ZeroMemory(&pi, sizeof(pi));
fprintf(stderr, "This is just a test");
//create child process
if (!CreateProcess(NULL,
L"C:\\Windows\\Notepad.exe",
NULL,
NULL,
FALSE,
0,
NULL,
NULL,
&si,
&pi))
{
fprintf(stderr, "create process failed");
return -1;
}
fprintf(stderr, "out of create");
//parent waits for child to complete
WaitForSingleObject(pi.hProcess, INFINITE);
fprintf(stderr, "after wait");
printf("Child Complete");
//close handle
CloseHandle(pi.hProcess);
// CloseHandle(pi.hthread);
}
如果有人知道如何克服这个问题,我们将不胜感激。
答案 0 :(得分:17)
问题是CreateProcess函数的第二个参数是输入/输出参数。
如果将其指定为字符串,则它是一个常量字符串,调用它时的函数无法写入内存位置,因此存在内存访问冲突。正确的方法是调用你的函数:
LPTSTR szCmdline = _tcsdup(TEXT("C:\\Windows\\Notepad.exe"));
//create child process
if (!CreateProcess(NULL,
szCmdline,
NULL,
NULL,
FALSE,
0,
NULL,
NULL,
&si,
&pi))
{
fprintf(stderr, "create process failed");
return -1;
}
您可能还想阅读this blog article。
答案 1 :(得分:1)
CreateProcess的第二个参数不能是const或文字字符串,因为func会尝试修改字符串。将文字复制到本地数组,然后将其作为第二个参数传递。