16

DLLからC++クラスをインポートする正しい方法は何ですか?VisualC++を使用しています。

dllexport / exports.def + LoadLibrary + GetProcAddress trifectaがありますが、C ++クラスでは機能せず、C関数でのみ機能します。これはC++の名前マングリングによるものですか?これを機能させるにはどうすればよいですか?

4

5 に答える 5

13

以下を追加する必要があります。

extern "C"
{
...
}

関数のマングリングを避けるため。

次の 2 つの単純な C 関数を作成することを検討してください。

SomeClass* CreateObjectInstace()
{
    return new SomeClass();
}

void ReleaseObject(SomeClass* someClass)
{
   delete someClass;
}

これらの関数のみを使用することで、後でオブジェクトの作成/削除の機能を追加/変更できます。これはファクトリーと呼ばれることもあります。

于 2008-09-21T12:05:14.563 に答える
6

http://www.codeproject.com/KB/DLL/XDllPt4.aspxでソリューションを見つけました

あなたの努力に感謝します

于 2008-09-21T12:06:31.970 に答える
2

私は通常、インターフェイスの基本クラスを宣言し、アプリケーションでこの宣言を使用してから、LoadLibrary、GetProcAddressを使用してファクトリ関数を取得します。係数は常にインターフェイスタイプのポインタを返します。

これは、動的にロードされたDLLからMFCドキュメント/ビューをエクスポートする実際の例です。

于 2008-09-21T11:59:30.787 に答える
2

dllexport / dllimportは機能します。ヘッダーファイルでクラス名の前に配置すれば、準備は完了です。

通常、dllでdllexportを使用し、exeでdllimportを使用します(ただし、どこでもdllexportを使用でき、それが機能します。「正しく」実行すると、ロードが非常に高速になります)。

明らかに、それはリンク時のコンパイル用です。/ delayloadリンカーディレクティブを使用して「動的」にすることができますが、それはおそらく件名に必要なものではありません。

LoadLibraryスタイルのロードが本当に必要な場合は、C++関数を「externC」ラッパーでラップする必要があります。問題は、名前のマングリングが原因で、完全にマングルされた名前を入力でき、それが機能することです。

回避策は通常、正しいクラスへのポインタを返すC関数を提供することです。COMは、dll内のオブジェクト内のインターフェイスメソッドを取得するために使用されるdllから4つのC関数をエクスポートするため、このように機能します。

于 2008-09-21T12:02:07.800 に答える
2

この質問をチェックしてください。基本的には、2 つの方法があります。_dllexport を使用してクラスをマークし、インポート ライブラリとリンクすると、DLL が自動的に読み込まれます。または、DLL を自分で動的にロードする場合は、@titanae が提案したファクトリ関数のアイデアを使用できます。

于 2008-09-21T12:08:07.833 に答える