dll(コンストラクタin dll)からいくつかのクラスを作成するにはどうすればよいですか?または(dll) DLLからクラスを動的にロードする方法はありますか?dll(コンストラクタin dll)からのクラスの作成方法(с++)
答えて
厳密にあなたの質問に答える、あなたはコンストラクタの結果を返すにextern「C」機能を追加する必要があります。
extern "C" foo* __declspec(dllexport) new_foo(int x) {
return new foo(x);
}
を次に、あなたの元に、あなたは、関数を呼び出すために「new_foo」にGetProcAddrを使用することができます。
コンストラクタを呼び出して新しいオブジェクトを返す関数を、DLLからエクスポートする必要があります。
具体的なC++型を関数パラメータとして使用しないようにしてください。 DLLのアイデアは、それらを独立に更新できるということですが、アップグレードされたコンパイラはstd :: stringを異なる方法でレイアウトし、実行時に非互換性を引き起こします。
これはCOMのルートにあります。たとえば、オブジェクトのインスタンスを取得するための限定型システムと標準のエクスポート関数です。
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内で動的にコンストラクタをルックアップする方法はありません。
代わりに__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();
}
インターフェイス/工場パターンがいいです.defaultsエクスポートテーブル –
メモリはDLLに割り当てられているので、' freeSomClass(IPublicInterface *) 'メモリが正しく解放されていることを確認しますか? – Robert
この回答は間違っていると思いますので、削除する必要があります。 プラグインとアプリケーションの両方でまったく同じコンパイラが使用されている場合を除いて、プラグイン境界を越えてポリモーフィックオブジェクトを渡すことはできません。 –
- 1. JNI dllブリッジの作成方法
- 2. アンマネージdllクラスのインスタンスを作成
- 3. Interop DLLから作業中のCOM dllインストールを見つける方法
- 4. HEXコードからDLLを作成
- 5. DLLからPDBを作成する
- 6. win32 dll in C#.net
- 7. は、DLLのクラス
- 8. DLLからのクラス関数の使用
- 9. ネイティブDLLを作成
- 10. matlabでDLLを作成し、これらのDLLを.Netアプリケーションで使用する方法
- 11. 私のC++コードのDLLを作成する方法。
- 12. vb.net dllのdllからc#クラスをインポートすることは可能ですか?
- 13. 別の.dllを参照する.dllを作成します。
- 14. Pantheios logger用の固定バックエンドDLLを作成する方法
- 15. DLLのクラスを使用してVB6アプリケーションを作成し、ビルド後にそのDLLをスワップアウトしますか?
- 16. IKVM 7.0 - JARからDLLファイルを正常に作成する方法
- 17. DNNモジュールで使用するWSDLからDLLを作成する方法
- 18. Visual Studio 2010からSWIGを使用してDLLを作成する方法
- 19. VS 2008のプロキシ/スタブDLLの作成
- 20. DLLの作成、__declspec(dllexport)との混同
- 21. vb6でのActiveX dllの作成
- 22. VC++でのDLLの作成(Visual Studio 2008)
- 23. 既存のmfcプロジェクトからdllを作成
- 24. 'cvCreateContourTree' in DLL 'opencv_imgproc231' - 非推奨ですか?
- 25. dllからの画像の使い方
- 26. 同じクラス名のDLL
- 27. DLLエクスポートのヘッダーを作成する
- 28. セットアッププロジェクトDLLファイルの作成情報
- 29. .netでクロスプラットフォームDLLを作成する方法
- 30. VS.netで作成した.dllファイルを逆コンパイルする方法
あなたは、一致するヘッダファイルを持っていますおよび/またはdllにアクセスするためのライブラリファイル? –
はい私はヘッダとソースを持っています – SomeUser