私は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日間グーグルでこれを行い、さまざまなことを試してきました。何か案は?
スポーンされたプロセスは、呼び出し元のプロセスと同じ権限を持つ必要があります。呼び出しプロセスが一時的なパスにファイルを作成できますか? –
おそらくここと同じです:http://stackoverflow.com/questions/8584811/c-msvs-what-file-cleanup-should-i-be-doing-cl-error-d8037 – alk
@PeterRitchie、はい呼び出しプロセスすべての可能な一時フォルダにファイルを作成して書き込むことができます。私はGetEnvironmentVariableを使ってTMPとTEMPの場所を取得しました。どちらもc:¥users¥xxxxx¥AppData¥Local¥Tempフォルダを指しています。 3番目のフォルダは、CreateProcess(TEMP = c:\ temp \ test \ tmp)に渡すTEMP varです。 – Shammi