2012-05-12 14 views
3

私はCreateProcessを呼び出してcl.exe(Win7 64ビット版VS2010)を起動します。次のエラーが表示されます。CreateProcessで起動したときにcl.exeが書き込み権限を持っていないようです

cl:コマンドラインエラーD8037:一時的な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); 

は、私から直接DLLを構築するために必要なツール、LIBS、などのほとんどの最小セットの上にコピーされましたcppファイル。コード内のコマンドは、環境変数ブロックに設定されたパスを持つ通常のコマンドラインで動作します。

また、これが何であるのだろうかと疑問に思っている場合は、DLLを動的にリロードできるアプリを用意しようとしています。アプリはデバッグ/ビジュアライゼーションに使用されています。そのアイデアは、その場でビジュアライゼーションコードを微調整してアプリがdllをリロードできるようにすることです。

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

+0

スポーンされたプロセスは、呼び出し元のプロセスと同じ権限を持つ必要があります。呼び出しプロセスが一時的なパスにファイルを作成できますか? –

+0

おそらくここと同じです:http://stackoverflow.com/questions/8584811/c-msvs-what-file-cleanup-should-i-be-doing-cl-error-d8037 – alk

+0

@PeterRitchie、はい呼び出しプロセスすべての可能な一時フォルダにファイルを作成して書き込むことができます。私はGetEnvironmentVariableを使ってTMPとTEMPの場所を取得しました。どちらもc:¥users¥xxxxx¥AppData¥Local¥Tempフォルダを指しています。 3番目のフォルダは、CreateProcess(TEMP = c:\ temp \ test \ tmp)に渡すTEMP varです。 – Shammi

答えて

5

問題が見つかりました。

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

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

関連する問題