3

グーグルした後、Dllimportが他のモジュールで関数を使用できるようにすることを知りました。

extern "c"識別子で関数を宣言することは必須ですか?

また、Dllexportは、Dll自体がコンパイル中に関数を使用することを意味します。したがって、デフォルトではすべて

DLLに存在する関数はdllexportですか?

4

3 に答える 3

20

__declspec(dllexport)シンボルをエクスポートします。DLLの外部から利用できるようになります。

__declspec(dllimport)シンボルをインポートします。実際には、「このシンボルはこのアプリケーションでは定義されていません。DLLファイルからインポートする必要があります」と書かれています。

で宣言する必要はありませんextern "C"。を使用しない場合extern "C"、シンボルはC ++シンボルとしてエクスポートされ、C ++(およびC ++ DLLの呼び出しをサポートする言語)からのみ呼び出すことができます。を使用するextern "C"と、シンボルはCシンボルとしてエクスポートされ、CDLLのスケーリングをサポートする言語から呼び出すことができます。

DLLをC#で使用する場合は、を使用する必要がありますextern "C"

これは、C#でC++DLLを使用する方法を示す優れたチュートリアルです。C++クラスをマーシャリングする方法。私は仕事で多くのプロジェクトでソリューションAを使用しました。

また、別のC++アプリケーションでC++ DLLを使用する方法についての短いチュートリアルがあります:C++でDLLを作成して使用する方法

于 2012-04-19T06:24:09.907 に答える
10

いいえ-dllexportは、他のモジュール(DLLまたは実行可能ファイル)がその機能を使用できるように、DLL(または実行可能ファイル)からエクスポートすることを意味します。

dllimportは、DLL(または実行可能ファイル)に実装されている関数を宣言するために使用されます。

したがって、一般的なケースでは、次のようになります。

#ifdef BUILDDLL
#define DLL declspec(dllexport)
#else
#define DLL declspec(dllimport)
#endif

次に、各パブリック関数DLLは次のようにマークされDLLます。

DLL int dosomething(int);

次に、DLLを構築するときに、BUILDDLLこれらすべての関数をdllexportとしてマークするように定義します。それ以外の場合は、関数を使用する必要があるクライアントコードに同じヘッダーを含めます。は定義されないためBUILDDLL、代わりにすべてdllimportとしてマークされます。したがって、リンク時間に関しては、標準ライブラリのような場所からこれらの機能を満たそうとするのではなく、そのDLLへのリンクを作成します。

于 2012-04-19T06:24:24.963 に答える
0

また、プロバイダーとコンシューマーの間の依存関係を文書化する exe、dll..files に、(リンカーによって) エントリ (静的なインポート テーブルとエクスポート テーブルの形式) が作成されることも意味します。

于 2012-05-04T14:22:46.517 に答える