Как установить путь поиска процесса, созданного из CreateProcess
-
14-12-2019 - |
Вопрос
Я использую CreateProcess
вызывать cl
скомпилировать и связать другую программу на C++ (TestProg.cxx
) в DLL.Я призываю cl.exe
со следующими параметрами компиляции:
варианты компиляции:
/Od /nologo /Fo /RTC /w /Zc TestProg.cxx /DLL
вызов:
if ( CreateProcess(PATH_TO_EXE, COMPILATION_OPTIONS, NULL,NULL,
FALSE,0,NULL,NULL,&si,&pi) )
{
//....
}
Если TestProg.exe
содержит #include <iostream.h>
Я получил следующую ошибку компиляции:
TestProg.cpp(1) : fatal error C1034: iostream.h: no include path set
Без всяких #include
команда, я получил следующую ошибку связи:
LINK : fatal error LNK1104: cannot open file 'LIBCMT.lib'
Что я делаю не так?
Я искал ответ последние 6-7 часов в сети, но не нашел.Использование Windows API для меня в новинку.
Решение
Если вы посмотрите на определение 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
);
Вы устанавливаете необязательный параметр __in_opt LPVOID lpEnvironment,
к NULL
.
Согласно указанному определению:
Указатель на блок среды для нового процесса.Если этот параметр равен NULL, новый процесс использует среду вызывающего процесса.
cl.exe
получает информацию о местоположении и пути поиска библиотеки из переменных среды - посмотрите setenv.bat
в каталоге VS.В этом случае ни вызывающий процесс, ни целевой процесс не работают в среде, где установлены эти переменные.
У вас есть выбор — вы можете сами создать переменные среды в соответствии с MSDN:
Блок окружающей среды состоит из нулевого блока строк с нулевым концевым.Каждая строка имеет следующий вид:
name=value\0
Поскольку равный знак используется в качестве сепаратора, он не должен использоваться во имя переменной среды.
Или вы можете потребовать, чтобы ваша программа запускалась из командной строки инструментов VS.Хорошей проверкой того, действительно ли это проблема, будет запуск вашей программы из этого приглашения, а не из Visual Studio, чтобы посмотреть, решит ли это проблему.
Причина не использования #include
выдает ошибку компоновщика из-за того, что при отсутствии включений, cl.exe
не будет их искать — затем он ищет библиотеки времени выполнения C/C++.
В качестве примечания: я считаю, что стандарт C++ заключается в #include <iostream>
то есть без .h
.