1

Windows プロジェクトでは、インターフェイス クラスを定義します。

class Interface {
public:
    virtual ~Interface() { }
    virtual void func() = 0;
};

およびファクトリ関数

__declspec(dllexport) Interface *construct();

DLL内。もちろんInterface、DLL 内には具体的な特殊化がありますが、エクスポートはしません。それでも、DLL の外部で使用できます。これはどのように作動しますか?vftableによって構築されるインスタンスのconstruct()は、DLL によってエクスポートされない関数を対象とする関数ポインタで構成されます。このアプローチは受け入れられますか、それとも多かれ少なかれハックですか?

4

1 に答える 1

4

具象クラスをエクスポートする必要はありません。インターフェイス ポインターから取得した v テーブルは、DLL 内に格納されている具体的な v テーブルに設定されます。すべての関数ポインタが実装メソッドに正しく設定されています。したがって、v-table ポインターを取得すると、ゴールデンになり、具体的なメソッドを呼び出すことができます。COM と比較すると、ファクトリ関数 (DllGetClassObject) 以外は、COM サーバーから何もエクスポートしません。

construct() 関数をエクスポートする必要があります。外部コードがこの関数のアドレスを取得できる方法は他にありません。関数名を関数アドレスにマップするルックアップ テーブルが必要です。DLL のエクスポート テーブル。関数とクラスをエクスポートすると、そのエクスポート テーブルにエントリが追加されます。

于 2013-06-11T17:41:23.640 に答える