《windows核心编程》86中提到,Createprocess的第二个参数pszCommandLine是一个非“常量字符串”的地址,这是很重要的,因为如果命令行字符串包含在文件映象的只读部分,就会引起访问违规。例如以下代码,在WIN7实际测试中,就会导致访问违规,因为Microsoft的C/C++编译器把notepad 字符串放在只读内存中。
#include "stdafx.h"
#include "iostream"
#include "windows.h"
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
STARTUPINFO si ={sizeof(si)};
PROCESS_INFORMATION pi;
CreateProcess(NULL,TEXT("notepad"),NULL,NULL,FALSE,0,NULL,NULL,&si,&pi);
system("pause");
return 0;
}
而CreateProcess 实际上会修改我们传给它的命令行字符串,但是CreateProcess在返回之前,会将这个字符串还原为原来的形似。这样一来由于编译器会将常量字符串放在一个只读的内存中,CreateProcess内部在修改这个字符串的时候就出现访问违规。
解决这个问题的最佳方式是在调用CreateProcess函数之前,把常量字符串复制到一个临时缓冲区中,代码如下
#include "stdafx.h"
#include "iostream"
#include "windows.