Cómo configurar la ruta de búsqueda de un proceso creado desde CreateProcess
-
14-12-2019 - |
Pregunta
estoy usando CreateProcess
invocar cl
para compilar y vincular otro programa C++ (TestProg.cxx
) en una DLL.yo invoco cl.exe
con las siguientes opciones de compilación:
opciones de compilación:
/Od /nologo /Fo /RTC /w /Zc TestProg.cxx /DLL
la llamada:
if ( CreateProcess(PATH_TO_EXE, COMPILATION_OPTIONS, NULL,NULL,
FALSE,0,NULL,NULL,&si,&pi) )
{
//....
}
Si TestProg.exe
contiene #include <iostream.h>
Recibí el siguiente error de compilación:
TestProg.cpp(1) : fatal error C1034: iostream.h: no include path set
Sin ningún #include
comando, recibí el siguiente error de vinculación:
LINK : fatal error LNK1104: cannot open file 'LIBCMT.lib'
¿Qué estoy haciendo mal?
Busqué la respuesta durante las últimas 6 a 7 horas en la web, pero no la encontré.Usar la API de Windows es nuevo para mí.
Solución
Si nos fijamos en la definición de CreateProcess
:
BOOL WINAPI CreateProcess(
__in_opt LPCTSTR lpApplicationName,
__inout_opt LPTSTR lpCommandLine,
__in_opt LPSECURITY_ATTRIBUTES lpProcessAttributes,
__in_opt LPSECURITY_ATTRIBUTES lpThreadAttributes,
__in BOOL bInheritHandles,
__in DWORD dwCreationFlags,
__in_opt LPVOID lpEnvironment,
__in_opt LPCTSTR lpCurrentDirectory,
__in LPSTARTUPINFO lpStartupInfo,
__out LPPROCESS_INFORMATION lpProcessInformation
);
Estás configurando el parámetro opcional. __in_opt LPVOID lpEnvironment,
a NULL
.
Según dicha definición:
Un puntero al bloque de entorno para el nuevo proceso.Si este parámetro es NULL, el nuevo proceso utiliza el entorno del proceso que llama.
cl.exe
obtiene su información de ubicación incluida y rutas de búsqueda de biblioteca a partir de variables de entorno; eche un vistazo a setenv.bat
en el directorio VS.En este caso, ni el proceso de llamada ni el proceso de destino se ejecutan en un entorno donde se establecen estas variables.
Tiene una opción: puede crear las variables de entorno usted mismo de acuerdo con MSDN:
Un bloque de entorno consiste en un bloque nulo terminado de cuerdas nulas terminadas.Cada cadena tiene la siguiente forma:
name=value\0
Debido a que el signo igual se usa como separador, no debe usarse en nombre de una variable de entorno.
O puede solicitar que su programa se ejecute desde el indicador de herramientas VS.Una buena comprobación de que este es realmente el problema sería ejecutar su programa desde este mensaje, en lugar de Visual Studio, para ver si eso soluciona el problema.
La razón por la que no se usa #include
produce un error del vinculador se debe al hecho de que si no hay inclusiones, cl.exe
no los buscará; luego busca las bibliotecas de tiempo de ejecución de C/C++.
Como nota al margen, creo que el estándar en C++ es #include <iostream>
es decir sin el .h
.