CreateProcess または CreateProcessW のいずれかを取得して、名前が MAX_PATH 文字未満のプロセスを実行しようとしていますが、パスは MAX_PATH 文字を超えています。ドキュメントによると:http://msdn.microsoft.com/en-us/library/ms682425.aspx、lpApplicationName が NULL でないことを確認する必要があり、lpCommandLine は最大 32,768 文字です。
試してみましたが、ERROR_PATH_NOT_FOUND が発生します。
CreateProcessW に変更しましたが、それでも同じエラーが発生します。で説明されているように、lpApplicationName の前に \\?\ を付けると、http://msdn.microsoft.com/en-us/library/aa365247(VS.85).aspx CreateProcessW を呼び出すと、別のエラーが表示され、もう少し近づいたと思われます: ERROR_SXS_CANT_GEN_ACTCTX。
CreateProcessW への私の呼び出しは次のとおりです。
CreateProcessW(w_argv0,arg_string,NULL,NULL,0,NULL,NULL,&si,&ipi);
w_argv0 はどこにありますか\\?\<long absolute path>\foo.exe.
arg_string には、"<長い絶対パス>\foo.exe" foo が含まれています
si は次のように設定されます。
memset(&si,0,sizeof(si)); si.cb = sizeof(si); si.dwFlags = STARTF_USESHOWWINDOW; si.wShowWindow = SW_HIDE;>
次のように、pi は空です。
memset(&pi,0,sizeof(pi));
システム イベント ログを調べたところ、イベント ID 59、ソース SideBySide: Generate Activation Context failed for .Manifest でこれを試行するたびに新しいエントリがあります。参照エラー メッセージ: 操作は正常に完了しました。
実行しようとしているファイルは、パス < MAX_PATH 文字で正常に実行されます。
明確にするために、<長い絶対パス> の 1 つのコンポーネントが MAX_PATH 文字を超えることはありません。最後に .manifest があっても、実行可能ファイル自体の名前は確かにそうではありません。ただし、パス全体を合わせると、長さが MAX_PATH 文字を超えています。
マニフェストを埋め込むかどうかに関係なく、同じエラーが発生します。マニフェストは foo.exe.manifest という名前で、埋め込まれていない場合は実行可能ファイルと同じディレクトリに存在します。を含む:
<?xml version='1.0' encoding='UTF-8' standalone='yes'?> <assembly xmlns='urn:schemas-microsoft-com:asm.v1' manifestVersion='1.0'> <依存関係> <依存アセンブリ> <assemblyIdentity type='win32' name='Microsoft.VC80.DebugCRT' version='8.0.50727.762' processorArchitecture='x86' publicKeyToken='1fc8b3b9a1e18e3b' /> </dependentAssembly> </依存> </アセンブリ>
これを機能させる方法を知っている人はいますか?おそらく:
CreateProcess または CreateProcessW を呼び出してパス > MAX_PATH 文字でプロセスを実行する別の方法
マニフェスト ファイルでできること
XP SP2 で Visual Studio 2005 を使用してビルドし、ネイティブで実行しています。
ご協力いただきありがとうございます。