usuario - cl.exe cuando se inicia a través de CreateProcess no parece tener permisos de escritura
permisos para ejecutar procedimientos almacenados sql-server (1)
Encontrado el problema.
Usé Process Monitor para monitorear cl.exe para ver qué estaba fallando. El monitor de procesos se puede descargar desde http://technet.microsoft.com/en-us/sysinternals/bb896645 .
Resulta que no se pudo cargar rsaenh.dll en la carpeta del sistema de Windows. cl.exe no pudo resolver la variable de entorno% SystemRoot%. Como estaba anulando las variables de entorno, se restableció. Al agregar SystemRoot = c: / Windows a las variables de entorno, se corrigió . La solución correcta sería obtener las variables de entorno para el proceso actual, analizarlas y modificarlas para hacer las adiciones de ruta y luego pasarlas. De esta forma, heredará todas las variables de entorno.
Llamaré a CreateProcess para iniciar cl.exe (VS2010 en Win7 de 64 bits). Obtuve el siguiente error..
cl: Error de línea de comando D8037: no se puede crear el archivo il temporal; limpiar el directorio temporal de viejos archivos il
Llamar a la misma línea de comando con las mismas variables de entorno en una ventana de cmd tiene éxito. Revisé el directorio temporal y no hay archivos antiguos. Parece que el proceso que se crea no tiene permisos de escritura. He estado probando diferentes enfoques. CreateProcessAsUser, establezca los atributos de seguridad para otorgar todos los permisos estándar al grupo de usuarios Todos, con y sin heredar identificadores, etc. Ninguno de ellos parece solucionarlo.
Y aquí está el código básico ...
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 );
En caso de que te estés preguntando sobre los caminos extraños, copié sobre el conjunto mínimo de herramientas necesarias, libs, etc. para construir un dll directamente desde un archivo cpp. El comando en el código funciona en una línea de comando regular con la ruta establecida en el bloque de variables del entorno.
Además, en caso de que te estés preguntando para qué sirve esto, estoy intentando tener una aplicación que pueda volver a cargar dinámicamente un dll. La aplicación se está utilizando para la depuración / visualización y la idea es poder modificar el código de visualización sobre la marcha y hacer que la aplicación vuelva a cargar el dll.
He estado en esto durante 4 días buscando en Google y probando cosas diferentes. ¿Algunas ideas?