DLLからC++クラスをインポートする正しい方法は何ですか?VisualC++を使用しています。
dllexport / exports.def + LoadLibrary + GetProcAddress trifectaがありますが、C ++クラスでは機能せず、C関数でのみ機能します。これはC++の名前マングリングによるものですか?これを機能させるにはどうすればよいですか?
以下を追加する必要があります。
extern "C"
{
...
}
関数のマングリングを避けるため。
次の 2 つの単純な C 関数を作成することを検討してください。
SomeClass* CreateObjectInstace()
{
return new SomeClass();
}
void ReleaseObject(SomeClass* someClass)
{
delete someClass;
}
これらの関数のみを使用することで、後でオブジェクトの作成/削除の機能を追加/変更できます。これはファクトリーと呼ばれることもあります。
http://www.codeproject.com/KB/DLL/XDllPt4.aspxでソリューションを見つけました
あなたの努力に感謝します
私は通常、インターフェイスの基本クラスを宣言し、アプリケーションでこの宣言を使用してから、LoadLibrary、GetProcAddressを使用してファクトリ関数を取得します。係数は常にインターフェイスタイプのポインタを返します。
これは、動的にロードされたDLLからMFCドキュメント/ビューをエクスポートする実際の例です。
dllexport / dllimportは機能します。ヘッダーファイルでクラス名の前に配置すれば、準備は完了です。
通常、dllでdllexportを使用し、exeでdllimportを使用します(ただし、どこでもdllexportを使用でき、それが機能します。「正しく」実行すると、ロードが非常に高速になります)。
明らかに、それはリンク時のコンパイル用です。/ delayloadリンカーディレクティブを使用して「動的」にすることができますが、それはおそらく件名に必要なものではありません。
LoadLibraryスタイルのロードが本当に必要な場合は、C++関数を「externC」ラッパーでラップする必要があります。問題は、名前のマングリングが原因で、完全にマングルされた名前を入力でき、それが機能することです。
回避策は通常、正しいクラスへのポインタを返すC関数を提供することです。COMは、dll内のオブジェクト内のインターフェイスメソッドを取得するために使用されるdllから4つのC関数をエクスポートするため、このように機能します。
この質問をチェックしてください。基本的には、2 つの方法があります。_dllexport を使用してクラスをマークし、インポート ライブラリとリンクすると、DLL が自動的に読み込まれます。または、DLL を自分で動的にロードする場合は、@titanae が提案したファクトリ関数のアイデアを使用できます。