2009-08-12 6 views
5

__declspec(dllimportの/のdllexport)と継承

#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

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

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

とにかくあなたが(別のエントリ・ポイントを経由して)あなたのDLL内の派生インスタンス化しなかった場合、仮想テーブルはまだ動作するはずですので、あなたがやった場合:

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

をあなたが(派生:: Bを呼び出すと思います)。あなたがベースとエクスポート派生クラスの両方を行う必要があり

3

あなたは彼らが輸出されている場合は

link /dump /exports <yourdll> 

を入力して、Visual Studioのコマンドシェルから見つけることができ、あなたは、機能のための「装飾名」を参照してくださいます。 、彼らは人間が読める形式であるかを確認するには1をコピー&ペーストして

undname <decorated name> 
1

ありませんが、DLLの外側では認識されません派生ありません。派生クラスをエクスポートするには、派生クラスにもDLLAPIマクロを適用する必要があります。