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日間グーグルして、さまざまなことを試してきました。何か案は?