Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ CreateProcess失败,出现错误998_C++_Winapi_Visual C++ - Fatal编程技术网

C++ CreateProcess失败,出现错误998

C++ CreateProcess失败,出现错误998,c++,winapi,visual-c++,C++,Winapi,Visual C++,我有一个自制的Win32脚本解释器,名为Wintasks,它已经完美地工作了15年。它使用CreateProcess分派win32可执行文件。它在Win7-32上仍然可以正常工作,但在Win7-64下,如果调用Wintasks时使用了任何命令行参数,则CreateProcess将失败,并出现错误998内存访问冲突。从Wintasks运行中删除命令行参数,一切正常 Wintasks从Winmain lpszCmdLine参数获取其第一个参数,即要运行的任务脚本,并且只有该参数可用。任务脚本文件名后

我有一个自制的Win32脚本解释器,名为Wintasks,它已经完美地工作了15年。它使用CreateProcess分派win32可执行文件。它在Win7-32上仍然可以正常工作,但在Win7-64下,如果调用Wintasks时使用了任何命令行参数,则CreateProcess将失败,并出现错误998内存访问冲突。从Wintasks运行中删除命令行参数,一切正常

Wintasks从Winmain lpszCmdLine参数获取其第一个参数,即要运行的任务脚本,并且只有该参数可用。任务脚本文件名后即使是空白也会导致问题。在引用_argv[]的所有情况下都可以成功访问参数

如前所述,当从MSVC5运行时,它是一个正在调试的旧程序,一切正常,因此我无法通过这种方式解决问题,问题出在发布可执行文件上。从Win32 VM使用完全相同的任务脚本文件运行完全相同的Wintasks副本没有问题

如果有任何灵感,我将不胜感激。我附加了运行CreateProcess的Wintasks中的代码

DWORD WinExecX(LPSTR cmdline, int winstate)
{
STARTUPINFO StartupInfo;
PROCESS_INFORMATION ProcessInformation;
BOOL CreateProcessStatus;
DWORD retval;
DWORD fdwCreate = 0;            /* flags for CreateProcess */
memset(&StartupInfo,0,sizeof(StartupInfo));
StartupInfo.cb = sizeof(StartupInfo);
StartupInfo.dwFlags=STARTF_USESHOWWINDOW;
StartupInfo.wShowWindow=winstate;
openerr=0;
CreateProcessStatus = CreateProcess( NULL, /*(LPTSTR)name,*/
 cmdline,
 NULL,
 NULL,
 FALSE, /* changed 2000-10-18 */
 fdwCreate,
 NULL, /*envblk,*/
 NULL,
 &StartupInfo,
 &ProcessInformation
 );

if(!CreateProcessStatus)
 {
 openerr=GetLastError();
 return 0;
 }

elevel=retval = (DWORD)ProcessInformation.hProcess;
CloseHandle(ProcessInformation.hThread);

return retval;
}

你怎么称呼WinExecX?cmdline的具体来源?通常是Wintasks中的字符串缓冲区,由程序用各种参数填充;所以它不是一个常量字符串。你定义了UNICODE吗?可以尝试显式调用CreateProcessaAPI吗?