3

CreateProcessを呼び出してcl.exe(Win7 64ビット上のVS2010)を起動します。次のエラーが発生します。

cl:コマンドラインエラーD8037:一時的なilファイルを作成できません。古いilファイルの一時ディレクトリをクリーンアップ

cmdウィンドウで同じ環境変数を使用して同じコマンドラインを呼び出すと成功します。一時ディレクトリを確認しましたが、古いファイルはありません。作成されたプロセスには書き込み権限がないようです。私はさまざまなアプローチを試してきました。CreateProcessAsUser、セキュリティ属性を設定して、ハンドルを継承する場合としない場合など、Everyoneユーザーグループにすべての標準権限を付与します。いずれも修正されていないようです。

そして、これが基本的なコードです...

SECURITY_ATTRIBUTES sa;
sa.nLength = sizeof( SECURITY_ATTRIBUTES );
sa.bInheritHandle = TRUE;
sa.lpSecurityDescriptor = NULL;

const char* _szSourceFile = "c:\\temp\\test\\src\\foo.cpp";

char szOptions[ 2048 ];
sprintf_s( szOptions, 
    "c:\\temp\\compile\\cl.exe "
    "/Gd "
    "/Fo\"c:\\temp\\test\\out\\\" "
    "/Fe\"c:\\temp\\test\\out\\\" "
    "/Fd\"c:\\temp\\test\\out\\\" "
    "/D \"WIN32\" "
    "/D \"_DEBUG\" "
    "/D \"_WINDOWS\" "
    "/D \"_USRDLL\" "
    "/D \"_WINDLL\" "
    "/D \"_MBCS\" "
    "/I\"c:\\Program Files (x86)\\Microsoft SDKs\\Windows\\v7.0A\\Include\" "
    "/MDd "
    "/I\"c:\\Program Files (x86)\\Microsoft Visual Studio 10.0\\VC\\include\" "
    "/LDd "
    "%s "
    "c:\\temp\\test\\lib\\Uuid.Lib "
    "c:\\temp\\test\\lib\\oldnames.lib "
    "c:\\temp\\test\\lib\\msvcrtd.lib"
    , _szSourceFile );


STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory( &si, sizeof( STARTUPINFO ) );
ZeroMemory( &pi, sizeof( PROCESS_INFORMATION ) );
si.cb = sizeof( STARTUPINFO );

BOOL bSucceeded = CreateProcess( "c:\\temp\\compile\\cl.exe", szOptions, NULL, NULL, FALSE, NORMAL_PRIORITY_CLASS, "PATH=c:\\temp\\Compile;%PATH%\0TEMP=c:\\temp\\test\\tmp\0\0", "c:\\temp\\test\\", &si, &pi );

奇妙なパスについて疑問に思っている場合は、必要なツールやライブラリなどの最小限のセットをコピーして、cppファイルから直接dllをビルドしました。コード内のコマンドは、環境変数ブロックで設定されたパスを使用して通常のコマンドラインで機能します。

また、これが何のためにあるのか疑問に思っている場合は、dllを動的にリロードできるアプリを作成しようとしています。このアプリはデバッグ/視覚化に使用されており、視覚化コードをその場で微調整して、アプリにdllをリロードさせることができます。

私はこれに4日間グーグルして、さまざまなことを試してきました。何か案は?

4

1 に答える 1

6

問題が見つかりました。

プロセスモニターを使用してcl.exeを監視し、何が失敗しているかを確認しました。プロセスモニターは、 http://technet.microsoft.com/en-us/sysinternals/bb896645からダウンロードできます。

Windowsシステムフォルダにrsaenh.dllをロードできなかったことが判明しました。cl.exeは%SystemRoot%環境変数を解決できませんでした。環境変数をオーバーライドしていたので、リセットされました。SystemRoot = c:\ Windowsを環境変数に追加すると、修正されました。適切な修正は、現在のプロセスの環境変数を取得し、それを解析および変更してパスを追加し、それを渡すことです。これにより、すべての環境変数を継承します。

于 2012-05-25T10:59:06.067 に答える