VS 2008 に 2 つのプロジェクトを含むソリューションがあります。1 つは C++ で記述された DLL で、もう 1 つは空のプロジェクトから作成された単純な C++ コンソール アプリケーションです。アプリケーションから DLL 内の関数を呼び出す方法を教えてください。
空の C++ プロジェクトから始めて、という関数を呼び出したいとします。int IsolatedFunction(int someParam)
どうやって呼ぶの?
VS 2008 に 2 つのプロジェクトを含むソリューションがあります。1 つは C++ で記述された DLL で、もう 1 つは空のプロジェクトから作成された単純な C++ コンソール アプリケーションです。アプリケーションから DLL 内の関数を呼び出す方法を教えてください。
空の C++ プロジェクトから始めて、という関数を呼び出したいとします。int IsolatedFunction(int someParam)
どうやって呼ぶの?
これを行うには多くの方法がありますが、最も簡単なオプションの 1 つは、リンク時にアプリケーションを DLL にリンクし、定義ファイルを使用して DLL からエクスポートされるシンボルを定義することだと思います。
注意:定義ファイルのアプローチは、装飾されていないシンボル名に最適です。装飾されたシンボルをエクスポートする場合は、おそらく定義ファイルのアプローチを使用しない方がよいでしょう。
これがどのように行われるかについての簡単な例を次に示します。
ステップ 1: export.hファイルで関数を定義します。
int WINAPI IsolatedFunction(const char *title, const char *test);
ステップ 2: export.cppファイルで関数を定義します。
#include <windows.h>
int WINAPI IsolatedFunction(const char *title, const char *test)
{
MessageBox(0, title, test, MB_OK);
return 1;
}
ステップ 3: export.def定義ファイルで関数をエクスポートとして定義します。
EXPORTS IsolatedFunction @1
ステップ 4: DLL プロジェクトを作成し、export.cppおよびexport.defファイルをこのプロジェクトに追加します。このプロジェクトをビルドすると、 export.dllとexport.libファイルが作成されます。
次の 2 つの手順では、リンク時に DLL にリンクします。リンク時にエントリ ポイントを定義したくない場合は、次の 2 つの手順を無視し、LoadLibraryとGetProcAddressを使用して実行時に関数エントリ ポイントを読み込みます。
ステップ 5: export.libファイルをプロジェクトに追加して、dll を使用するテストアプリケーション プロジェクトを作成します。export.dllファイルを、テストコンソールの実行可能ファイルと同じ場所にコピーします。
ステップ 6:以下に示すように、Test アプリケーション内からIsolatedFunction関数を呼び出します。
#include "stdafx.h"
// get the function prototype of the imported function
#include "../export/export.h"
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
// call the imported function found in the dll
int result = IsolatedFunction("hello", "world");
return 0;
}
dll から関数をエクスポートしたり、exe からインポートしたりすることもできます。最初はややこしいですが、最終的には LoadLibrary/GetProcAddress を呼び出すよりもはるかに簡単です。MSDNを参照してください。
VS ウィザードを使用してプロジェクトを作成すると、関数をエクスポートできるチェック ボックスが dll に表示されます。
次に、exe アプリケーションで、適切な定義を使用して dll のヘッダーを #include し、dll プロジェクトを依存関係として exe アプリケーションに追加するだけです。
この点をさらに調査したい場合は、この他の質問を確認してくださいdllexport を使用して DLL から関数をエクスポートします。
LoadLibrary/GetProcAddress ルートに移動するか (Harper が彼の回答で述べたように、実行時の動的リンク MSDN サンプルへのリンクを再度示します)、コンソール アプリケーションを DLL プロジェクトから生成された .lib にリンクし、hea を含めることができます。関数の宣言を含む .h ファイル (読み込み時の動的リンク MSDN サンプルで説明されているように)
どちらの場合も、DLL が適切に呼び出したい関数をエクスポートしていることを確認する必要があります。これを行う最も簡単な方法は、関数宣言で __declspec(dllexport) を使用することです (単純なダイナミック リンク ライブラリの作成の MSDN サンプル を参照)。ただし、DLL プロジェクトの対応する .def ファイルを使用して行うこともできます。
DLL のトピックの詳細については、MSDN のダイナミック リンク ライブラリについてのトピックを参照してください。
必要な手順は次の 5 つです。
http://www.softwareandfinance.com/Visual_CPP/DLLDynamicBinding.htmlで、段階的な VC++ IDE のスクリーン ショットを見つけることができます。
コード スニペットは次のとおりです。
int main()
{
/***
__declspec(dllimport) bool GetWelcomeMessage(char *buf, int len); // used for static binding
***/
typedef bool (*GW)(char *buf, int len);
HMODULE hModule = LoadLibrary(TEXT("TestServer.DLL"));
GW GetWelcomeMessage = (GW) GetProcAddress(hModule, "GetWelcomeMessage");
char buf[128];
if(GetWelcomeMessage(buf, 128) == true)
std::cout << buf;
return 0;
}
DLL が作成されると、通常はインポート ライブラリが自動的に作成され、プログラムにリンクされたものをヘッダー ファイルと共に使用して呼び出す必要がありますが、そうでない場合は、LoadLibraryやGetProcAddressなどの Windows 関数を手動で呼び出して動作させることができます。
DLL の動的ランタイム ローディングについて話していると仮定すると、LoadLibrary と GetProAddress を探しています。MSDNに例があります。