操作系统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的明路就更好了
先感谢了

解决方案 »

  1.   

    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); 
      

  2.   

    Yes,Because you use constant string, then cause an violation
    please check msdn:
    http://msdn.microsoft.com/en-us/library/ms682425(VS.85).aspxThe 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.
      

  3.   

    其实你不用看那么长英文,看看CreateProcess函数原型,第二个参数是LPTSTR,不是LPCTSTR,后者是常量字符串,前者是可修改字符串