40

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

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

どうやって呼ぶの?

4

7 に答える 7

21

これを行うには多くの方法がありますが、最も簡単なオプションの 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.dllexport.libファイルが作成されます。

次の 2 つの手順では、リンク時に DLL にリンクします。リンク時にエントリ ポイントを定義したくない場合は、次の 2 つの手順を無視し、LoadLibraryGetProcAddressを使用して実行時に関数エントリ ポイントを読み込みます。

ステップ 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;
}
于 2009-02-12T04:36:58.533 に答える
9

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

VS ウィザードを使用してプロジェクトを作成すると、関数をエクスポートできるチェック ボックスが dll に表示されます。

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

この点をさらに調査したい場合は、この他の質問を確認してくださいdllexport を使用して DLL から関数をエクスポートします

于 2009-02-11T23:50:41.653 に答える
6

LoadLibrary/GetProcAddress ルートに移動するか (Harper が彼の回答で述べたように、実行時の動的リンク MSDN サンプルへのリンクを再度示します)、コンソール アプリケーションを DLL プロジェクトから生成された .lib にリンクし、hea を含めることができます。関数の宣言を含む .h ファイル (読み込み時の動的リンク MSDN サンプルで説明されているように)

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

DLL のトピックの詳細については、MSDN のダイナミック リンク ライブラリについてのトピックを参照してください。

于 2009-02-11T23:52:22.053 に答える
6

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

  1. 関数ポインタを宣言する
  2. ライブラリをロードする
  3. 手続き先住所を取得する
  4. それを関数ポインタに割り当てます
  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;
}
于 2013-10-10T22:04:41.137 に答える
0

DLL が作成されると、通常はインポート ライブラリが自動的に作成され、プログラムにリンクされたものをヘッダー ファイルと共に使用して呼び出す必要がありますが、そうでない場合は、LoadLibraryGetProcAddressなどの Windows 関数を手動で呼び出して動作させることができます。

于 2009-02-11T23:54:06.107 に答える
0

DLL の動的ランタイム ローディングについて話していると仮定すると、LoadLibrary と GetProAddress を探しています。MSDNに例があります。

于 2009-02-11T23:37:49.250 に答える