グーグルした後、Dllimportが他のモジュールで関数を使用できるようにすることを知りました。
extern "c"識別子で関数を宣言することは必須ですか?
また、Dllexportは、Dll自体がコンパイル中に関数を使用することを意味します。したがって、デフォルトではすべて
DLLに存在する関数はdllexportですか?
__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を作成して使用する方法。
いいえ-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へのリンクを作成します。
また、プロバイダーとコンシューマーの間の依存関係を文書化する exe、dll..files に、(リンカーによって) エントリ (静的なインポート テーブルとエクスポート テーブルの形式) が作成されることも意味します。