1

我有一个名为 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;
}
4

0 回答 0