Unicode导致CreateProcess失败

永夜星空 2009-12-15 12:08:41
操作系统Windows2003,编译环境VS2008,我有如下这段程序用来启动其他程序的

STARTUPINFO si;
memset(&si, 0, sizeof(STARTUPINFO));
si.cb = sizeof(STARTUPINFO);
si.dwFlags = STARTF_USESHOWWINDOW;
si.wShowWindow = SW_SHOW;
PROCESS_INFORMATION pi;
CreateProcess(NULL,_T("e:\\abc.exe"),NULL,NULL,FALSE,0,NULL,NULL,&si,&pi);

开始还以为没什么问题,连编也没提示任何错误和警告。可是运行的时候老提示
"0x7c80ba99" 指令引用的 "0x00480c80" 内存。该内存不能为 "written"。
以前写类似的代码从来没这样问题,这段代码换到Dev-C++也没什么问题,后来想来
可能是因为Unicode字符集的事,把项目字符集改成 多字节字符集 后就OK了。
小弟Unicode程序写的少,以为只是把字符串加个_T()就行了,看来不只这样

我实在不想因为这个问题而把项目改成非Unicode的
所以想请教各位先知在Unicode下怎么让这个函数正常呢
如果能给指条Unicode的明路就更好了
先感谢了
...全文
860 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
永夜星空 2009-12-15
  • 打赏
  • 举报
回复
是真的啊,万分感谢。原以为省点代码,想不到增加了这么多麻烦。原来微软早就有说,英语不好真是麻烦,视而不见。也不知道还没有其它函数也存在这个问题。
leonhano 2009-12-15
  • 打赏
  • 举报
回复
Yes,

Because you use constant string, then cause an violation


please check msdn:
http://msdn.microsoft.com/en-us/library/ms682425(VS.85).aspx

The Unicode version of this function, CreateProcessW, can modify the contents of this string. Therefore, this parameter cannot be a pointer to read-only memory (such as a const variable or a literal string). If this parameter is a constant string, the function may cause an access violation.



[Quote=引用 1 楼 arong1234 的回复:]
CreateProcess的第二个参数必须是可写缓冲区,因此用常量字符串是不对的,你用一个字符串数组看看:

C/C++ code

STARTUPINFO si;
memset(&si,0,sizeof(STARTUPINFO));
si.cb=sizeof(STARTUPINFO);
si.dwFlags= STARTF_USESHOWWINDOW;
si.wShowWindow= SW_SHOW;
PROCESS_INFORMATION pi;
TCHAR cmd[MAX_PATH]= _T("e:\\abc.exe");
CreateProcess(NULL,cmd,NULL,NULL,FALSE,0,NULL,NULL,&si,&pi);
[/Quote]
arong1234 2009-12-15
  • 打赏
  • 举报
回复
CreateProcess的第二个参数必须是可写缓冲区,因此用常量字符串是不对的,你用一个字符串数组看看:



STARTUPINFO si;
memset(&si, 0, sizeof(STARTUPINFO));
si.cb = sizeof(STARTUPINFO);
si.dwFlags = STARTF_USESHOWWINDOW;
si.wShowWindow = SW_SHOW;
PROCESS_INFORMATION pi;
TCHAR cmd[MAX_PATH] = _T("e:\\abc.exe");
CreateProcess(NULL,cmd,NULL,NULL,FALSE,0,NULL,NULL,&si,&pi);

永夜星空 2009-12-15
  • 打赏
  • 举报
回复
受教了
arong1234 2009-12-15
  • 打赏
  • 举报
回复
其实你不用看那么长英文,看看CreateProcess函数原型,第二个参数是LPTSTR,不是LPCTSTR,后者是常量字符串,前者是可修改字符串

15,466

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧