web-dev-qa-db-ja.com

DLLでクラスを使用する方法は?

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内にクラスを配置するにはどうすればよいですか?ありがとうございます。

19
r1cebank

ランタイムダイナミックリンクを使用する場合(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

25
bcsanches

解決策bcsanchesによって提案されました、

 __declspec(dllexport) ISDLConsole *Create()
 {
    return new SDLConsole();
 }

このアプローチを 推奨 bybcsanchesとして使用する場合は、次の関数を使用してdeleteあなたのオブジェクト、

 __declspec(dllexport) void Destroy(ISDLConsole *instance)
 {
       delete instance;
 }

同じヒープ/メモリからオブジェクトを削除することを確実にするので、そのような関数常にをペアで定義します-それらが作成されたpool/etc。これを参照してください pair-functions

13
Nawaz

できます、そしてあなたが必要とするすべての情報は このページこのページ にあります:

#ifdef _EXPORTING
   #define CLASS_DECLSPEC __declspec(dllexport)
#else
   #define CLASS_DECLSPEC __declspec(dllimport)
#endif

class CLASS_DECLSPEC SDLConsole
{
    /* ... */
};

残っているのは、プリプロセッサシンボルを定義することだけです_EXPORTINGDLLをビルドするとき。

5
icecrime

クラス内のデータを公開したい場合、上記のソリューションはそれをカットしません。 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プロジェクトを最初から作成し、[シンボルのエクスポート]チェックボックスをオンにすると、この手法を使用してサンプルコードが生成されます。

2