VS 2008には2つのプロジェクトを含むソリューションがあります。 1つはC++で記述されたDLLで、もう1つは空のプロジェクトから作成された単純なC++コンソールアプリケーションです。アプリケーションからDLLの関数を呼び出す方法を知りたい。
空のC++プロジェクトから始めて、int IsolatedFunction(int someParam)
という関数を呼び出したいと仮定します。
どうやって呼ぶの?
これを行うには多くの方法がありますが、最も簡単なオプションの1つは、リンク時にアプリケーションをDLLにリンクし、definition fileDLLからエクスポートされるシンボルを定義します。
CAVEAT:定義ファイルのアプローチは、装飾されていないシンボル名に最適です。装飾されたシンボルをエクスポートしたい場合は、おそらく定義ファイルのアプローチをNOT USEする方が良いでしょう。
これがどのように行われるかの簡単な例を示します。
ステップ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を使用するTestアプリケーションプロジェクトを作成しますプロジェクトへのファイル。 export.dllファイルをTestコンソール実行可能ファイルと同じ場所にコピーします。
ステップ6:以下に示すように、テストアプリケーション内から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アプリケーションに追加するだけです。
この点をさらに調査したい場合は、この他の質問を確認してください 関数をDLL with dllexport 。
LoadLibrary/GetProcAddressルートに進むことができます(Harperが答えで言及したように、 ランタイムダイナミックリンクのMSDNサンプル へのリンクが再びあります)、またはコンソールアプリケーションを、.libから生成された.libにリンクできますDLLプロジェクトおよび関数の宣言にhea.hファイルをインクルードします( ロード時の動的リンクMSDNサンプル で説明)
どちらの場合でも、DLLが適切に呼び出す関数をエクスポートすることを確認する必要があります。最も簡単な方法は、関数宣言で__declspec(dllexport)を使用することです。 シンプルダイナミックリンクライブラリのMSDNサンプル )の作成。ただし、DLLプロジェクトの対応する.defファイルを使用して行うこともできます。
DLLのトピックの詳細については、 MSDN About Dynamic-Link Libraries トピックを参照してください。
必要な5つの手順は次のとおりです。
ステップごとにVC++を見つけることができますIDEスクリーンショット http://www.softwareandfinance.com/Visual_CPP/DLLDynamicBinding.html
コードスニペットは次のとおりです。
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 を有効にします。
DLLの動的な実行時読み込みについて話していると仮定して、LoadLibraryとGetProAddressを探しています。 [〜#〜] msdn [〜#〜] に例があります。