我有一个名为Wintasks的自制Win32脚本解释器已经工作了15年。它使用CreateProcess()
调度win32可执行文件。它仍可在Win7-32上正常工作,但在Win7-64下如果在调用Wintasks时使用任何命令行参数,CreateProcess将失败并显示错误998
(内存访问冲突)。从Wintasks运行中删除命令行参数,一切都很顺利。
Wintasks从Winmain lpszCmdLine
参数获取其第一个参数(要运行的任务脚本),并且只有该参数可用。在任务脚本文件名之后放一个空白会导致问题。在引用__argv[]
的所有情况下都可以成功访问参数。
当从MSVC5(如上所述,它是一个旧程序)运行时,调试一切正常,所以我无法解决这个问题,它只是Release可执行文件提出了问题。使用来自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;
}