1

タイトルが言うように、私が本当に意味しているのは「後でそれらを使用する」ことだと思いますが。

セットアップ

私はこの答えに従いました:

https://stackoverflow.com/a/13219631/696407

非常に単純なdllを作成します

#include <stdio.h>
extern "C"
{
    __declspec(dllexport) void DisplayHelloFromMyDLL()
    {
        printf ("Hello DLL.\n");
    }
}

そして、リリース用にコンパイルされたdllがあります:

  • DllTest.dll
  • DllTest.exp
  • DllTest.lib
  • DllTest.pdb

dumpbin から DllTest.dll を実行すると、次の行が見つかります。

1    0 00001000 DisplayHelloFromMyDLL = _DisplayHelloFromMyDLL

DLL の使用

その機能を新しいソリューションで使用するには、

  1. 新しいソリューションでプロジェクトを開始する
  2. DLL の場所を以下のプロジェクトに追加します。
    • プロパティ
      • 構成プロパティ
        • リンカ
          • 全般的
            • 追加のライブラリ ディレクトリ
  3. 以下に .lib ファイルを追加します。
    • プロパティ
      • 構成プロパティ
        • リンカ
          • 入力
            • 追加の依存関係

そして、そこに .lib を追加したら、次のステップは... hvæt?

私のコードは今:

#include "stdafx.h"

int _tmain(int argc, _TCHAR* argv[])
{
    while(1)
    {
        DisplayHelloFromMyDLL();
    }
    return 0;
}

しかし、それはうまくいきません。

編集:「うまくいかない」というのは曖昧だと思います。関数は取得しますError: identifier "DisplayHelloFromMyDLL" is undefined

(補足質問: 私の関数は呼び出されていますDisplayHelloFromMyDLL();_DisplayHelloFromMyDLL();?)

4

2 に答える 2

0

.dll を使用するには、ヘッダー ファイルと .lib の 2 つが必要です。

ヘッダー ファイルは、名前がどこかに という関数があることをコンパイラが認識できるようにするためのものDisplayHelloFromMyDLL()です。この時点では、それがどこにあるかは関係ありません。コンパイラにどこかにあると伝えただけです。リンカが where ビットを処理します。

.lib ファイルはリンカー用です。.dll に存在するリンカにDisplayHelloFromMyDLL()、(あなたの場合) dll の名前が DllTest.dll であることを伝えます。プログラムが起動すると、Windows ローダーはこの情報を使用して .dll をプロセスにロードし、アドレス修正を実行してDisplayHelloFromMyDLL()、アプリケーションでの呼び出しが .dll 内の関数を呼び出すようにします。

実行可能ファイルをビルドするために .dll は実際には必要ありません。実行するためだけに必要です。

于 2013-09-06T09:54:10.113 に答える