CreateProcess函数第二个命令行参数--(windows核心编程笔记)

来源:互联网 发布:手机淘宝对话框打不开 编辑:程序博客网 时间:2024/05/17 07:01

      《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.h"using namespace std;int _tmain(int argc, _TCHAR* argv[]){STARTUPINFO si ={sizeof(si)};PROCESS_INFORMATION pi;TCHAR szCmdLine[]=TEXT("notepad");CreateProcess(NULL,szCmdLine,NULL,NULL,FALSE,0,NULL,NULL,&si,&pi);system("pause");return 0;}


 

 

原创粉丝点击