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'
.
私は何をしていますか?
Web上で最後の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に従って環境変数を作成できます。
環境ブロックは、ヌル終端ブロックで構成されています。 ヌル終端文字列。各文字列は次の形式です。
.name=value\0
等号は区切り文字として使用されているため、使用しないでください。 環境変数の名前
またはプログラムをVS Toolsプロンプトから実行する必要があります。良いチェックこれは、実際には問題がこのプロンプトからプログラムを実行することです。
#include
を使用しない理由はリンカエラーを生成することは、含まれていない場合、cl.exe
がそれらを探すことはできません - それはC / C ++ランタイムlibsを探します。
サイドとして注 - C ++の標準は#include <iostream>
なしで.h
i.eになると考えています。