現在は、 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 ファイルを使わないのであれば、クラスのメソッドを呼び出す関数を個
>別に作らねばならないかと思います。
インスタンス作成が駄目で関数しか使用してはいけないとしたら
私が現在やっている方法は、関数経由でインスタンスを作成し、そのインスタンスから関
数を呼んでいるので別な方法にしないといけないということなんですよね?
実際、どのような方法を使えばよいのでしょうか?
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 にすると呼べるんだ…
> てか、なんで 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();
}