Come impostare il percorso di ricerca di un processo creato da CreateProcess
-
14-12-2019 - |
Domanda
sto usando CreateProcess
invocare cl
per compilare e collegare un altro programma C++ (TestProg.cxx
) in una DLL.invoco cl.exe
con le seguenti opzioni di compilazione:
opzioni di compilazione:
/Od /nologo /Fo /RTC /w /Zc TestProg.cxx /DLL
la chiamata:
if ( CreateProcess(PATH_TO_EXE, COMPILATION_OPTIONS, NULL,NULL,
FALSE,0,NULL,NULL,&si,&pi) )
{
//....
}
Se TestProg.exe
contiene #include <iostream.h>
Ho ricevuto il seguente errore di compilazione:
TestProg.cpp(1) : fatal error C1034: iostream.h: no include path set
Senza alcun #include
comando, ho ricevuto il seguente errore di collegamento:
LINK : fatal error LNK1104: cannot open file 'LIBCMT.lib'
Che cosa sto facendo di sbagliato?
Ho cercato la risposta nelle ultime 6-7 ore sul web, ma non l'ho trovata.L'utilizzo dell'API di Windows è nuovo per me.
Soluzione
Se guardi la definizione di 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
);
Stai impostando il parametro facoltativo __in_opt LPVOID lpEnvironment,
A NULL
.
Secondo detta definizione:
Puntatore al blocco di ambiente per il nuovo processo.Se questo parametro è NULL, il nuovo processo utilizza l'ambiente del processo chiamante.
cl.exe
ottiene le informazioni sulla posizione e i percorsi di ricerca della libreria dalle variabili di ambiente: dai un'occhiata setenv.bat
nella directory VS.In questo caso, né il processo chiamante né il processo di destinazione sono in esecuzione in un ambiente in cui sono impostate queste variabili.
Hai una scelta: puoi creare tu stesso le variabili di ambiente secondo MSDN:
Un blocco ambientale è costituito da un blocco di stringhe a termini nulli.Ogni stringa è nella seguente forma:
name=value\0
Poiché il segno uguale viene utilizzato come separatore, non deve essere utilizzato a nome di una variabile di ambiente.
Oppure puoi richiedere che il tuo programma venga eseguito dal prompt degli strumenti VS.Un buon controllo su questo è effettivamente il problema sarebbe eseguire il programma da questo prompt, anziché da Visual Studio, per vedere se questo risolve il problema.
Il motivo per cui non lo utilizzo #include
produce un errore del linker è dovuto al fatto che se non ci sono include, cl.exe
non li cercherà, quindi cercherà le librerie di runtime C/C++.
Come nota a margine: credo che lo standard in C++ sia quello #include <iostream>
cioè senza il .h
.