クラスをdllで作成し、使用したい – 固定ページ 2 – プログラミング – Home

クラスをdllで作成し、使用したい
 
通知
すべてクリア

クラスをdllで作成し、使用したい

固定ページ 2 / 2

ぴちょん
 ぴちょん
(@ぴちょん)
ゲスト
結合: 21年前
投稿: 8
Topic starter  

現在は、 GetProcAddress で CreateInputMouse という関数を取得し
その関数を使用して InputMouseというクラスを作成しています。
pIMouse->testでメンバ関数を呼んでいます。

//dll作成側
#ifdef CLASS_EXPORTS
#define CLASS_API __declspec(dllexport)
#else
#define CLASS_API __declspec(dllimport)
#endif

extern C CLASS_API DInputMouse * CreateInputMouse()
{
return new InputMouse();
}
class CLASS_API InputMouse
{
public:

    InputMouse()
{
}

    ~InputMouse()
{

}
virtual void test();

}
void InputMouse::test()
{

OutputDebugString(testが呼ばれました);
}

//使用する側
CreateInputMouse *Input =
(CreateInputMouse*)this->m_Module.GetProcAddress(CreateInputMouse);
InputMouse *pIMouse = Input();
pIMouse->test();

>たとえ関数でクラスのインスタンスを作成しようと
>も、そのインスタンスが使えないということです。
>どうしても LIB ファイルを使わないのであれば、クラスのメソッドを呼び出す関数を個
>別に作らねばならないかと思います。

インスタンス作成が駄目で関数しか使用してはいけないとしたら
私が現在やっている方法は、関数経由でインスタンスを作成し、そのインスタンスから関
数を呼んでいるので別な方法にしないといけないということなんですよね?

実際、どのような方法を使えばよいのでしょうか?


返信引用
aetos
(@aetos)
Noble Member
結合: 5年前
投稿: 1480
 

CreateInput は関数ポインタでしたか。

> 実際、どのような方法を使えばよいのでしょうか?
大変カッコ悪いのですが…

//dll作成側
#ifdef CLASS_EXPORTS
#define CLASS_API __declspec(dllexport)
#else
#define CLASS_API __declspec(dllimport)
#endif

extern C CLASS_API void* __stdcall CreateInputMouse()
{
return static_cast< void* >( new InputMouse() );
}

extern C CLASS_API void __stdcall DestroyInputMouse( void *pInput )
{
delete ( static_cast< InputMouse * >( pInput ) );
}

extern C CLASS_API void __stdcall DoTest( void *pInput )
{
( static_cast< InputMouse * >( pInput ) )->test();
}

class CLASS_API InputMouse
{
public:
InputMouse()
{
}

~InputMouse()
{
}

void test(); // virtual にはしない
}

void InputMouse::test()
{
OutputDebugString(testが呼ばれました);
}

//使用する側
void *pIMouse = CreateInputMouse();
DoTest( pIMouse );
DestroyInputMouse( pIMouse );

…となるのではないかなぁ、と。

てか、なんで virtual にすると呼べるんだ…


返信引用
dairygoods
 dairygoods
(@dairygoods)
ゲスト
結合: 23年前
投稿: 1421
 

> てか、なんで virtual にすると呼べるんだ…

virtual関数の場合、インスタンスの中に関数ポインタが
含まれるので、実装が無くてもコンパイルできます。

怪しくない方法としては、こんな感じ。

inputmouse.h ---- DLLとEXEの両方でinclude

class InputMouse // CLASS_APIはつけない
{
public:
virtual void test() = 0;
};

inputmouse.cpp --- DLL側だけで使用

class InputMouseImpl : public ImputMouse
{
public:
virtual void test() {
// 実装する
}
};

extern C CLASS_API InputMouse* __stdcall CreateInputMouse()
{
return new InputMouseImpl();
}


返信引用
固定ページ 2 / 2

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました