web-dev-qa-db-ja.com

C ++からDLLで関数を呼び出す

VS 2008には2つのプロジェクトを含むソリューションがあります。 1つはC++で記述されたDLLで、もう1つは空のプロジェクトから作成された単純なC++コンソールアプリケーションです。アプリケーションからDLLの関数を呼び出す方法を知りたい。

空のC++プロジェクトから始めて、int IsolatedFunction(int someParam)という関数を呼び出したいと仮定します。

どうやって呼ぶの?

39
QueueHammer

これを行うには多くの方法がありますが、最も簡単なオプションの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;
}
20
jussij

Dllから関数をエクスポートし、exeからインポートすることもできます。最初は扱いにくいですが、最終的にLoadLibrary/GetProcAddressを呼び出すよりもはるかに簡単です。 [〜#〜] msdn [〜#〜] を参照してください。

VSウィザードでプロジェクトを作成する場合、dllに関数をエクスポートできるチェックボックスがあります。

次に、exeアプリケーションで、適切な定義を含むdllのヘッダーを#includeするだけで、dllプロジェクトを依存関係としてexeアプリケーションに追加するだけです。

この点をさらに調査したい場合は、この他の質問を確認してください 関数をDLL with dllexport

9
Ismael

LoadLibrary/GetProcAddressルートに進むことができます(Harperが答えで言及したように、 ランタイムダイナミックリンクのMSDNサンプル へのリンクが再びあります)、またはコンソールアプリケーションを、.libから生成された.libにリンクできますDLLプロジェクトおよび関数の宣言にhea.hファイルをインクルードします( ロード時の動的リンクMSDNサンプル で説明)

どちらの場合でも、DLLが適切に呼び出す関数をエクスポートすることを確認する必要があります。最も簡単な方法は、関数宣言で__declspec(dllexport)を使用することです。 シンプルダイナミックリンクライブラリのMSDNサンプル )の作成。ただし、DLLプロジェクトの対応する.defファイルを使用して行うこともできます。

DLLのトピックの詳細については、 MSDN About Dynamic-Link Libraries トピックを参照してください。

6
Franci Penov

必要な5つの手順は次のとおりです。

  1. 関数ポインタを宣言します
  2. ライブラリをロードする
  3. 手続きアドレスを取得する
  4. 関数ポインタに割り当てます
  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 を有効にします。

0
Tim Matthews

DLLの動的な実行時読み込みについて話していると仮定して、LoadLibraryとGetProAddressを探しています。 [〜#〜] msdn [〜#〜] に例があります。

0
Harper Shelby