前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >CreateProcess 创建带命令行参数的进程时,报错或者提示内存位置无效的可能的一个原因

CreateProcess 创建带命令行参数的进程时,报错或者提示内存位置无效的可能的一个原因

作者头像
大菊观
发布2018-05-24 13:38:20
2.2K0
发布2018-05-24 13:38:20
举报

可能的一个原因:命令行参数使用了常量。

例如:

CreateProcess(NULL, "notepad",NULL,NULL,FALSE,CREATE_NO_WINDOW,NULL,NULL,&si,&pi);

解释:

pszApplicationName和pszCommandLine分别表示进程使用的可执行文件名和向其传递的命令行字符串,注意pszCommandLine是PTSTR,这意味着你必须为其传递指向非常量字符串的地址。CreateProcess内部会更改向其传递的命令行字符串,但在CreateProcess返回之前,它会将该字符串恢复原样。这一点是非常重要的,因为如果你向CreateProcess传递的命令行字符串位于进程的只读存储区,就会发生Access Violation错误。

微软在其C++编译器选项中提供了/GF开关,/GF打开时,程序中所有用到的常量字符串将只维护单一副本,且位于只读存储部分。在调用 CreateProcess时,开发人员应该打开/GF开关并使用缓冲区。我们希望微软在未来版本的Windows中会改进CreateProcess,使其接受常量字符串作为命令行参数,并在其内部分配/释放临时缓冲区而不是让API调用者来做。另外,假如你使用常量ANSI字符串作为 CreateProcess参数,并不会发生Access Violation错误,我们在前面的章节已经提到过,许多WinAPI函数的ANSI版本会将ANSI参数转换为UNIDOE编码后调用其 Unicode版本,CreateProcess会把ANSI字符串转换为Unicode编码后放在临时缓冲区,并调用Unicode版的 CreateProcess,因此不会触发Access Violation。

你如果想要一个动态长度命令行参数,可以参考下面的代码

STARTUPINFO si = { sizeof(si) };

PROCESS_INFORMATION pi; LPTSTR pszCmd = new TCHAR[strCmd.length()+1]; memset(pszCmd,0,sizeof(TCHAR)*(strCmd.length()+1)); _tcscpy(pszCmd,strCmd.c_str()); CreateProcess(NULL, pszCmd,NULL,NULL,FALSE,CREATE_NO_WINDOW,NULL,NULL,&si,&pi); WaitForSingleObject(pi.hProcess,INFINITE);

CloseHandle(pi.hProcess);

额外说一点,我在做上述测试时发现,调用CreateProcess来调用cmd.exe,我的程序没报错,但是系统却报cmd.exe应用程序错误(无法正常启动0xc0000142)。但是我手动启动cmd.exe,又可以正常启动。

通过查询一篇文章发现:STARTUPINFO si = { sizeof(si) };很关键。

当你直接写STARTUPINFO si;此时si里面一些内容可能是随机的。如果你没有清空其内容,STARTUPINFO(EX)的内容会是调用线程堆栈上的一些数据。将这些垃圾数据传递给CreateProcess可能导致无法预料的结果,为了让CreateProcess正常工作,你必须将STARTUPINFO(EX)中没有用到的域清0。

个人水平有限,如有错误请联系我更改。活到老,学到老!

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017年07月15日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档