2011-08-09 19 views
6

Windows XPの新しい環境でWindows XPのレガシーコードをコンパイルしようとしていますが、実行時にコンパイルされますが失敗します。Windows 7でCreateProcessが失敗する

のCreateProcess()は0を返すし、GetLastError()ここではERROR_FILE_NOT_FOUND

の略、2を返すには、CreateProcessを

奇妙ため今
STARTUPINFO StartInfo; 
memset(&StartInfo, 0, sizeof(StartInfo)); 

wcsncpy(astrCommandLine, L"TFTP", MAX_OSCOMMANDLINE_SZ-1); 
BOOL bFuncRetn = CreateProcess(NULL, 
       astrCommandLine,  // command line 
       NULL,   // process security attributes 
       NULL,   // primary thread security attributes 
       NULL,   // handles are inherited 
       0,    // creation flags 
       NULL,   // use parent's environment 
       NULL,   // use parent's current directory 
       &StartInfo,   // STARTUPINFO pointer 
       &m_ProcInfo); // receives PROCESS_INFORMATION 

に私の呼び出しです:代わりに、TFTPの私はカルクを実行すると、 calcがポップアップします。コマンドプロンプトのどこからでも私のコマンドライン上にあるものを実行できますので、%PATH%to c:\ windows \ system32はわかっていて正しく動作します。

私はAnsi文字列でCreateProcessAを強制しようとしましたが、同じ結果が得られました。私はまた、デバッグとリリースの設定とコマンドラインから試しました。

EDIT: calc.exeとtftp.exeの両方は、システムパスにあるc:\ windows \ system32にあります。
"c:¥windows¥system32¥tftp"が動作しない

+0

システムパスではなくアプリケーションパスによってtftpが検出されていますか?それはcalcが見つかったがtftpが見つからない理由を説明するかもしれない。 CreateProcessはApp Pathsを使用しません。私はあなたがどこかでStartInfo.cbを設定していると仮定しています。 –

+0

これがうまくいくという希望はほとんどありません。確かに、tftp.exeはプログラムのデフォルトの作業ディレクトリにありません。 Calc.exeは問題ではなく、PATHにあります。 c:\ foo \ bar \ tfpt.exeのように、.exeの*フル*パス名を渡します。 –

+0

私はStartInfo.cbについて聞いたことがありません – Eric

答えて

9

問題は、64ビットWindowsコマンドを実行しようとしている32ビットアプリケーションがあることです。問題を解決するためにアプリケーションを64ビットとして再コンパイルする必要はありません。すべてのc:\ windows \ system32をc:\ windows \ SysNativeに変更するだけです。

Windows 7 x64では、32ビットプログラムからのc:\ windows \ system32への参照は自動的にc:\ windows \ syswow64にリダイレクトされます。特別なエイリアスc:\ windows \ SysNativeを使用すると、Windows 7はリダイレクトを実行しません。