Como definir o caminho de pesquisa de um processo criado a partir de CreateProcess
-
14-12-2019 - |
Pergunta
Eu estou usando CreateProcess
para invocar cl
para compilar e ligar outro programa C++ (TestProg.cxx
) em uma DLL.Eu invoco cl.exe
com as seguintes opções de compilação:
opções de compilação:
/Od /nologo /Fo /RTC /w /Zc TestProg.cxx /DLL
a chamada:
if ( CreateProcess(PATH_TO_EXE, COMPILATION_OPTIONS, NULL,NULL,
FALSE,0,NULL,NULL,&si,&pi) )
{
//....
}
Se TestProg.exe
contém #include <iostream.h>
Eu tenho o seguinte erro de compilação:
TestProg.cpp(1) : fatal error C1034: iostream.h: no include path set
Sem qualquer #include
comando, eu tenho a seguinte ligação de erro:
LINK : fatal error LNK1104: cannot open file 'LIBCMT.lib'
O que estou fazendo de errado?
Eu procurei a resposta para a última 6-7 horas na web, mas não encontrá-lo.Usando a API do windows é novo para mim.
Solução
Se você olhar para a definição 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
);
Você está definindo o parâmetro opcional __in_opt LPVOID lpEnvironment,
para NULL
.
De acordo com a referida definição:
Um ponteiro para o bloco de ambiente para o novo processo.Se este parâmetro for NULL, o novo processo usa o ambiente do processo de chamada.
cl.exe
fica a sua incluir informações de localização e caminhos de pesquisa de biblioteca a partir de variáveis de ambiente - ter um olhar para setenv.bat
no VS directory.Neste caso, nem o seu processo de chamada ou seu processo de destino estiver executando em um ambiente onde estas variáveis são definidas.
Você tem uma escolha: você pode criar as variáveis de ambiente a si mesmo de acordo com o MSDN:
Um bloco de ambiente consiste de um terminada com nulo bloco de seqüências de terminação nula.Cada seqüência de caracteres é o seguinte formulário:
name=value\0
Porque o sinal de igual é utilizado como um separador, ele não deve ser usado em o nome de uma variável de ambiente.
Ou você pode exigir o seu programa para ser executado a partir do VS ferramentas de linha de comandos.Uma boa seleção este é, na verdade, o problema não seria executar o programa a partir desta linha de comandos, em vez de Visual Studio, para ver se isso corrige o problema.
A razão para não usar #include
produz um erro de vinculador é devido ao fato de se não há inclui, cl.exe
não olhar para eles - em seguida, ele olha para o C/C++, bibliotecas de tempo de execução.
Como uma nota lateral - eu acredito que o padrão em C++ é a #include <iostream>
eu.e sem a .h
.