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

本文探讨了《Windows核心编程》中关于CreateProcess函数使用时,因命令行参数位于只读内存导致的访问违规问题。通过实际测试在Win7环境下,当命令行参数为常量字符串时,会导致访问违规。原因是CreateProcess函数会尝试修改该字符串,但由于编译器将常量字符串存放在只读内存,从而触发异常。为解决此问题,建议在调用前将常量字符串复制到临时缓冲区。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

      《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;
}


 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值