1

私はWintasksと呼ばれる自作のWin32スクリプトインタープリターを持っています。これは15年間完璧に機能しています。を使用してwin32実行可能ファイルをディスパッチしCreateProcess()ます。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;
}
4

0 に答える 0