So legen Sie den Suchpfad eines von CreateProcess erstellten Prozesses fest
-
14-12-2019 - |
Frage
ich benutze CreateProcess
aufrufen cl
um ein anderes C++-Programm zu kompilieren und zu verknüpfen (TestProg.cxx
) in eine DLL.Ich rufe an cl.exe
mit folgenden Kompilierungsoptionen:
Kompilierungsoptionen:
/Od /nologo /Fo /RTC /w /Zc TestProg.cxx /DLL
der Anruf:
if ( CreateProcess(PATH_TO_EXE, COMPILATION_OPTIONS, NULL,NULL,
FALSE,0,NULL,NULL,&si,&pi) )
{
//....
}
Wenn TestProg.exe
enthält #include <iostream.h>
Ich habe den folgenden Kompilierungsfehler erhalten:
TestProg.cpp(1) : fatal error C1034: iostream.h: no include path set
Ohne irgendetwas #include
Befehl, ich habe den folgenden Verknüpfungsfehler erhalten:
LINK : fatal error LNK1104: cannot open file 'LIBCMT.lib'
Was mache ich falsch?
Ich habe die Antwort in den letzten 6-7 Stunden im Internet gesucht, sie aber nicht gefunden.Die Verwendung der Windows-API ist für mich neu.
Lösung
Wenn Sie sich die Definition von ansehen 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
);
Sie legen den optionalen Parameter fest __in_opt LPVOID lpEnvironment,
Zu NULL
.
Nach besagter Definition:
Ein Zeiger auf den Umgebungsblock für den neuen Prozess.Wenn dieser Parameter NULL ist, verwendet der neue Prozess die Umgebung des aufrufenden Prozesses.
cl.exe
erhält seine Include-Standortinformationen und Bibliothekssuchpfade aus Umgebungsvariablen – schauen Sie sich das an setenv.bat
im VS-Verzeichnis.In diesem Fall werden weder Ihr aufrufender Prozess noch Ihr Zielprozess in einer Umgebung ausgeführt, in der diese Variablen festgelegt sind.
Sie haben die Wahl – Sie können die Umgebungsvariablen gemäß MSDN selbst erstellen:
Ein Umgebungsblock besteht aus einem nullterminierten Block von Null-terminierten Saiten.Jede Zeichenfolge hat die folgende Form:
name=value\0
Da das gleiche Zeichen als Trennzeichen verwendet wird, darf es im Namen einer Umgebungsvariablen nicht verwendet werden.
Oder Sie können verlangen, dass Ihr Programm über die VS-Tools-Eingabeaufforderung ausgeführt wird.Eine gute Überprüfung, ob das tatsächlich das Problem ist, wäre, Ihr Programm über diese Eingabeaufforderung und nicht über Visual Studio auszuführen, um zu sehen, ob das Problem dadurch behoben wird.
Der Grund für die Nichtverwendung #include
erzeugt einen Linker-Fehler, der darauf zurückzuführen ist, dass keine Includes vorhanden sind. cl.exe
sucht nicht danach, sondern sucht dann nach den C/C++-Laufzeitbibliotheken.
Als Randbemerkung: Ich glaube, dass der Standard in C++ darin besteht #include <iostream>
d.h. ohne die .h
.