Как установить путь поиска процесса, созданного из CreateProcess

StackOverflow https://stackoverflow.com//questions/9710893

Вопрос

Я использую 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top