2009-10-04 5 views
8

dll(コンストラクタin dll)からいくつかのクラスを作成するにはどうすればよいですか?または(dll) DLLからクラスを動的にロードする方法はありますか?dll(コンストラクタin dll)からのクラスの作成方法(с++)

+0

あなたは、一致するヘッダファイルを持っていますおよび/またはdllにアクセスするためのライブラリファイル? –

+0

はい私はヘッダとソースを持っています – SomeUser

答えて

3

厳密にあなたの質問に答える、あなたはコンストラクタの結果を返すにextern「C」機能を追加する必要があります。

extern "C" foo* __declspec(dllexport) new_foo(int x) { 
    return new foo(x); 
} 

を次に、あなたの元に、あなたは、関数を呼び出すために「new_foo」にGetProcAddrを使用することができます。

3

コンストラクタを呼び出して新しいオブジェクトを返す関数を、DLLからエクスポートする必要があります。

具体的なC++型を関数パラメータとして使用しないようにしてください。 DLLのアイデアは、それらを独立に更新できるということですが、アップグレードされたコンパイラはstd :: stringを異なる方法でレイアウトし、実行時に非互換性を引き起こします。

これはCOMのルートにあります。たとえば、オブジェクトのインスタンスを取得するための限定型システムと標準のエクスポート関数です。

+0

DLLのソースが自分のコントロール下にないかのように、Ttは聞こえます。 –

+0

DLLソースが自分の管理下にあります – SomeUser

+0

クラスを使用する予定の場合は、既に__declspec(dllexport)でコンパイルされているはずですので、ヘッダーファイルを__declspec(dllimport)をクラス定義。そうでない場合は、いつでもヘッダファイルを自分で変更できます。 – JesperE

10

DLLをビルドするときにキーワード__declspec(dllexport)を使用してクラスを宣言する必要があります。 DLLを使用する場合は、クラスが__declspec(dllimport)で宣言する必要があります:DLLがコンパイルされたとき、あなたは定義のリストに-DCOMPILING_DLLを追加する必要があります

#ifdef COMPILING_DLL 
#define DECLSPEC_CLASS __declspec(dllexport) 
#else 
#define DECLSPEC_CLASS __declspec(dllimport) 
#endif 

class DECLSPEC_CLASS MyClass 
{ 
... 
} 

クラスを使用する場合は、静的にDLLにリンクする必要があります。つまり、インポートライブラリmydll.libをメインプログラムに渡す必要があります。

DLL をランタイムにロードするには、オブジェクトを作成して返すC関数がDLLに必要です。 GetProcAddress()を使用してDLL内で動的にコンストラクタをルックアップする方法はありません。

+1

最後のステートメントのソースを引用できますか? AFAIKのctorには名前の変更があり、その名前を使用してGetProcAddressを呼び出すことができます。何があなたを止めるでしょうか? – MSalters

+0

はい、技術的に正しいです。 'GetProcAddress'を使用して手動で管理する場合は特に – JesperE

3

代わりに__declspecを使用して、クラスのすべてのメソッドをエクスポートするの、あなたはコンパイラは、たとえばので、vtableのを介して仮想関数を呼び出すことができるという事実にも頼ることができます。

//note: no __declspec 
class IPublicInterface 
{ 
    virtual ~IPublicInterface() = 0; 
    virtual void SomeMethod() = 0; 
}; 

//note: no __declspec 
class SomeClass : IPublicInterface 
{ 
    virtual ~SomeClass() { ... } 
    virtual void SomeMethod() { ... } 
}; 

//note: this is the only method which needs to be exported from the DLL 
IPublicInterface* createSomeClass() 
{ 
    return new SomeClass(); 
} 
+0

インターフェイス/工場パターンがいいです.defaultsエクスポートテーブル –

+0

メモリはDLLに割り当てられているので、' freeSomClass(IPublicInterface *) 'メモリが正しく解放されていることを確認しますか? – Robert

+0

この回答は間違っていると思いますので、削除する必要があります。 プラグインとアプリケーションの両方でまったく同じコンパイラが使用されている場合を除いて、プラグイン境界を越えてポリモーフィックオブジェクトを渡すことはできません。 –

関連する問題