私は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;
}