5

次のクラスを持つ DLL があるとします。

#define DLLAPI __declspec(...)

class DLLAPI Base
{
    public:
    virtual void B();
};

class Derived : public Base
{
    public:
    virtual void B();
    virtual void D();
};

「DLLAPI」キーワードがクラス定義に適用されていない場合でも (少なくとも、直接ではなく)、私の「派生」クラスは dll の外部に表示されますか?

「D()」関数は可視ですか?

ありがとう

4

4 に答える 4

5

class Derived は、DLL によってエクスポートされません。クラスはエクスポートを継承しません。それに DLLAPI も追加します。

また、クラス メンバーはデフォルトでプライベート アクセシビリティに設定されているため、どのメソッドにもアクセスできないようにする必要があることに注意してください。ただし、テストで Base::B() がエクスポートされていることがわかります。DLL を使用するコードの C++ ヘッダーはエラーにフラグを立てますが、それをだますことができれば、ヘッダーを微調整したのではないでしょうか。

とにかく、DLL 内で (別のエントリ ポイントを介して) Derived をインスタンス化した場合、仮想テーブルは引き続き機能するはずです。

Base* b = getTheDerived(); b->B();

Derived::B() を呼び出します。

于 2009-08-12T18:26:33.063 に答える
3

次のように入力して、Visual Studio コマンド シェルから確認できます。

link /dump /exports <yourdll>

エクスポートすると、関数の「装飾名」が表示されます。人間が読める形式でそれらが何であるかを確認するには、コピーして貼り付けて実行します

undname <decorated name>
于 2009-08-12T18:20:11.517 に答える
1

いいえ、派生はDLLの外部には表示されません。派生クラスをエクスポートするには、DLLAPIマクロを派生クラスにも適用する必要があります。

于 2009-08-12T18:23:02.557 に答える
0

基本クラスと派生クラスの両方をエクスポート可能にする必要があります。

http://msdn.microsoft.com/en-us/library/81h27t8c.aspx

All base classes of an exportable class must be exportable. If not, a compiler 
warning is generated.
于 2014-08-26T09:30:11.257 に答える