我有一个名为 Wintasks 的自制 Win32 脚本解释器,它已经完美运行了 15 年。它使用CreateProcess()
. 它在 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;
}