DLL内にクラスを配置できますか?私が書いたクラスはこれです:
class SDLConsole
{
public:
SDLConsole();
~SDLConsole(){};
void getInfo(int,int);
void initConsole(char*, char*, SDL_Surface*, int, int, int);
void sendMsg(char*,int, SDL_Surface*);
void cls(SDL_Surface*);
private:
TTF_Font *font;
SDL_Surface *consoleImg;
int width, pos, height, line, size, ctLine;
SDL_Surface* render(char*,int);
};
DLLをロードしてDLL内で関数を使用する方法を知っていますが、DLL内にクラスを配置するにはどうすればよいですか?ありがとうございます。
ランタイムダイナミックリンクを使用する場合(LoadLibraryを使用してdllをロードする)、クラスに直接アクセスできない場合は、クラスのインターフェイスを宣言し、次のようにこのクラスのインスタンスを返す関数を作成する必要があります。
class ISDLConsole
{
public:
virtual void getInfo(int,int) = 0;
virtual void initConsole(char*, char*, SDL_Surface*, int, int, int) = 0;
virtual void sendMsg(char*,int, SDL_Surface*) = 0;
virtual void cls(SDL_Surface*) = 0;
};
class SDLConsole: public ISDLConsole
{
//rest of the code
};
__declspec(dllexport) ISDLConsole *Create()
{
return new SDLConsole();
}
それ以外の場合、ロード時にdllをリンクする場合は、icecrimeが提供する情報を使用してください。 http://msdn.Microsoft.com/en-us/library/a90k134d.aspx
解決策bcsanchesによって提案されました、
__declspec(dllexport) ISDLConsole *Create()
{
return new SDLConsole();
}
このアプローチを 推奨 bybcsanchesとして使用する場合は、次の関数を使用してdelete
あなたのオブジェクト、
__declspec(dllexport) void Destroy(ISDLConsole *instance)
{
delete instance;
}
同じヒープ/メモリからオブジェクトを削除することを確実にするので、そのような関数常にをペアで定義します-それらが作成されたpool/etc。これを参照してください pair-functions
クラス内のデータを公開したい場合、上記のソリューションはそれをカットしません。 DLLコンパイルでクラス自体に__declspec(dllexport)
を、DLLにリンクするモジュールで__declspec(dllimport)
を叩く必要があります。
一般的な手法はこれを行うことです(Microsoftウィザードは次のようなコードを生成します):
#ifdef EXPORT_API
#define MY_API __declspec(dllexport)
#else
#define MY_API __declspec(dllimport)
#endif
class MY_API MyClass {
...
};
次に、EXPORT_API
はDLLプロジェクトで定義されており、DLLにリンクするモジュールで定義されていないことを確認してください。
Visual C++で新しいDLLプロジェクトを最初から作成し、[シンボルのエクスポート]チェックボックスをオンにすると、この手法を使用してサンプルコードが生成されます。