質問

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段階が必要です:

  1. 宣言は、関数ポインタ
  2. 負荷の図書館
  3. 取得の手続きのアドレス
  4. 割り当て関数ポインタ
  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 それを機能させるために。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top