2

別の C++ プログラム ( ) を DLLにコンパイルおよびリンクするCreateProcessために呼び出すために使用しています。次のコンパイル オプションを使用して呼び出します。clTestProg.cxxcl.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 時間の回答を Web で検索しましたが、見つかりませんでした。Windows API を使用するのは初めてです。

4

1 に答える 1

2

の定義を見ると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.batVS ディレクトリを見てください。この場合、これらの変数が設定されている環境では、呼び出しプロセスもターゲット プロセスも実行されていません。

MSDN に従って環境変数を自分で作成できます。

環境ブロックは、ヌル終了文字列のヌル終了ブロックで構成されます。各文字列は次の形式です。

name=value\0

等号はセパレータとして使用されるため、環境変数の名前には使用しないでください。

または、プログラムを VS ツール プロンプトから実行するように要求することもできます。これが実際に問題であることを確認するには、Visual Studio ではなく、このプロンプトからプログラムを実行して、問題が解決するかどうかを確認します。

を使用しない#includeとリンカ エラーが発生する理由は、インクルードがない場合、インクルードがcl.exe検索されないためです。その後、C/C++ ランタイム ライブラリが検索されます。

補足として、C++ の標準#include <iostream>.h.

于 2012-03-14T22:26:13.863 に答える