質問

私はこれら 2 つの違いについての簡単で簡潔な説明を探しているだけです。MSDN では、ここではあまり詳しく説明していません。

役に立ちましたか?

解決

  • __declspec(dllexport) このオブジェクトを他の DLL がインポートできるようにすることをリンカーに指示します。他の人がリンクできる DLL を作成するときに使用されます。

  • __declspec(dllimport) DLL から実装をインポートして、アプリケーションで使用できるようにします。

私は C/C++ 開発の初心者にすぎないので、おそらく誰かが私よりも詳しい説明を持っているでしょう。

他のヒント

__declspec( dllexport ) - タグ付けされたクラスまたは関数は、組み込まれている DLL からエクスポートされます。DLL を構築していて API が必要な場合は、これを使用するか、エクスポートを定義する別の .DEF ファイルを使用する必要があります (MSDN)。これは定義を 1 か所に保持できるため便利ですが、.DEF ファイルにはさらに多くのオプションが用意されています。

__declspec( dllimport ) - タグ付けされたクラスまたは関数は DLL からインポートされます。これは実際には必要ありません - インポート ライブラリが必要です ともかく リンカを幸せにするためです。しかし、適切にマークされている場合、 dllimport, 、コンパイラとリンカーは呼び出しを最適化するのに十分な情報を持っています。これがないと、インポート ライブラリ内のスタブ関数への通常の静的リンクが得られ、不要な間接化が追加されます。 ONT1 ONT2

2 つの異なる使用例:

1) DLL 内でクラス実装を定義しています。別のプログラムでそのクラスを使用したいとします。ここでは、dll で公開するクラスを作成するときに dllexport を使用します。

2) DLL が提供する関数を使用している。DLL に付属のヘッダーを含めます。ここで、ヘッダーは dllimport を使用して、現在のプログラムで使用される実装を取り込みます。

多くの場合、両方のケースで同じヘッダー ファイルが使用され、マクロが定義されます。ビルド構成では、必要に応じてインポートまたはエクスポートするマクロを定義します。

Dllexport は、関数をエクスポート済みとしてマークするために使用されます。DLL に関数を実装し、エクスポートすると、DLL を使用する誰もがその関数を利用できるようになります。

Dllimport はその逆です。関数が DLL からインポートされたものとしてマークされます。この場合、関数のシグネチャを宣言し、コードをライブラリにリンクするだけです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top