C++ から DLL 内の関数を呼び出す
-
22-08-2019 - |
質問
VS 2008 に 2 つのプロジェクトを含むソリューションがあります。1 つは C++ で書かれた DLL で、もう 1 つは空のプロジェクトから作成された単純な C++ コンソール アプリケーションです。アプリケーションからDLL内の関数を呼び出す方法を知りたいです。
空の C++ プロジェクトから始めて、という関数を呼び出すとします。 int IsolatedFunction(int someParam)
なんと呼べばいいのでしょうか?
解決
があり、これを行うには多くの方法があるが、私は最も簡単なオプションのいずれかがリンク時に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 のdefintionファイルでエクスポートとして関数を定義します。
。EXPORTS IsolatedFunction @1
のステップ4:のDLLプロジェクトを作成し、このプロジェクトにがexport.cpp と export.def のファイルを追加します。このプロジェクトを構築することは、のexport.dll と export.lib のファイルを作成します。
次の2つのステップは、リンク時にDLLにリンクしています。あなたは、リンク時にエントリポイントを定義し、次の2つのステップを無視して、実行時ののLoadLibrary とのGetProcAddress をロードする機能のエントリポイントを使用しない場合。
のステップ5:のプロジェクトにのexport.lib のファイルを追加することで、DLLを使用するには、のテストのアプリケーションプロジェクトを作成します。 テストのコンソールで実行可能としてTHS同じ場所に、 export.dll のファイルをコピーします。
のステップ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;
}
他のヒント
また、exeファイルからDLLとインポートから関数をエクスポートすることができ、それが最初で、よりトリッキーですが、最終的にはLoadLibraryの/ GetProcAddressなどを呼び出すよりもはるかに簡単です。 MSDN を参照してください。
あなたが関数をエクスポートしましょうdllファイルのチェックボックスがありますVSウィザードでプロジェクトを作成するときます。
次に、exeファイルのアプリケーションであなただけの適切な定義でDLLからヘッダを#includeし、exeファイルのアプリケーションへの依存関係としてDLLプロジェクトを追加する必要があります。
あなたがから関数をエクスポートするこの時点さらにはを調査する場合は、この他の質問をチェックDLLEXPORT を持つDLLます。
LoadLibrary/GetProcAddress ルートに進むこともできます (Harper が回答で述べたように、ここにリンクがあります) 実行時の動的リンク MSDN サンプル または、コンソール アプリケーションを DLL プロジェクトから生成された .lib にリンクし、関数の宣言を含む hea.h ファイルをインクルードすることもできます (「 ロード時の動的リンクの MSDN サンプル)
どちらの場合も、呼び出す関数が DLL によって適切にエクスポートされていることを確認する必要があります。これを行う最も簡単な方法は、関数宣言で __declspec(dllexport) を使用することです (「 シンプルなダイナミックリンクライブラリのMSDNサンプル) ただし、DLL プロジェクト内の対応する .def ファイルを通じて行うこともできます。
DLL のトピックの詳細については、以下を参照してください。 MSDN ダイナミック リンク ライブラリについて トピック。
以下の5段階が必要です:
- 宣言は、関数ポインタ
- 負荷の図書館
- 取得の手続きのアドレス
- 割り当て関数ポインタ
- 電話の機能を使用関数ポインタ
で、一歩一歩VC++の画面で 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関数とGetProAddressを探しています。 MSDN の上の例があります。
DLL が作成されると、通常、インポート ライブラリが自動的に作成されます。これを呼び出すには、ヘッダー ファイルとともにプログラムにリンクされたインポート ライブラリを使用する必要がありますが、そうでない場合は、次のような Windows 関数を手動で呼び出すことができます。 ロードライブラリ そして GetProcAddress それを機能させるために。