如何设置从CreateProcess创建的流程的搜索路径

How to set search path of a process created from CreateProcess

本文关键字:创建 路径 搜索 CreateProcess 何设置 设置      更新时间:2023-10-16

我正在使用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从环境变量中获取其包含位置信息和库搜索路径-请查看VS目录中的setenv.bat。在这种情况下,调用进程和目标进程都没有在设置了这些变量的环境中运行。

您可以选择-您可以根据MSDN创建环境变量:

环境块由一个空终止的块组成以null结尾的字符串。每个字符串的形式如下:

name=value

因为等号用作分隔符,所以不能在中使用环境变量的名称。

或者,您可以要求从VS工具提示符下运行程序。一个很好的检查——事实上,问题是从这个提示运行程序,而不是Visual Studio,看看这是否解决了问题。

不使用#include会产生链接器错误的原因是,如果没有include,cl.exe就不会查找它们,而是查找C/C++运行时库。

顺便说一句,我认为C++中的标准是#include <iostream>,即没有.h