简体   繁体   English

如何在 DLL 中使用类?

[英]How to use a class in DLL?

Can I put a class inside a DLL?我可以将类放入 DLL 中吗? The class i wrote is this:我写的课是这样的:

    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);

};

I know how to load a DLL and use the function inside a DLL, but how can I put a class inside a DLL?我知道如何加载 DLL 并在 DLL 中使用该函数,但是如何将类放入 DLL 中? Thank you very much.非常感谢。

If you use run time dynamic linking (uses LoadLibrary to load the dll) you cannot access the class directly, you need to declare a interface for your class and create a function that returns a instance of this class, like this:如果使用运行时动态链接(使用 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();
 }

Otherwise, if you link the dll during load time, just use the information provided by icecrime: http://msdn.microsoft.com/en-us/library/a90k134d.aspx否则,如果您在加载时链接 dll,只需使用 icecrime 提供的信息: http : //msdn.microsoft.com/en-us/library/a90k134d.aspx

Solution suggested by bcsanches , bcsanches建议的解决方案

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

If you're going to use this approach as suggested by bcsanches , then make sure that you use the following function to delete your object,如果您打算按照bcsanches 的建议使用这种方法,请确保使用以下函数delete您的对象,

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

Define such functions always in pair, as it ensures that you delete your objects from the same heap/memory-pool/etc they were created on.始终成对定义此类函数,因为它确保您从创建对象的同一个堆/内存池/等中删除对象。 See this pair-functions看到这个对函数

You can, and all the information you need are on this page and this page :您可以,并且您需要的所有信息都在此页面此页面上

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

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

All there is left is to define the preprocessor symbol _EXPORTING when building the DLL.剩下的就是在构建 DLL 时定义预处理器符号_EXPORTING

If you want to expose the data in a class, the above solutions won't cut it.如果你想在一个类中公开数据,上面的解决方案不会削减它。 You have to slap a __declspec(dllexport) on the class itself in the DLL compilation, and a __declspec(dllimport) in the module that links to the DLL.您必须在 DLL 编译中的类本身上添加一个__declspec(dllexport) ,并在链接到 DLL 的模块中添加一个__declspec(dllimport)

A common technique is to do this (Microsoft wizards produce code like this):一种常见的技术是这样做(微软向导生成这样的代码):

#ifdef EXPORT_API
#define MY_API __declspec(dllexport)
#else
#define MY_API __declspec(dllimport)
#endif

class MY_API MyClass {
   ...
};

Then make sure EXPORT_API is defined in the DLL project, and make sure it isn't defined in the module that links to the DLL.然后确保EXPORT_API在 DLL 项目中定义,并确保它没有在链接到 DLL 的模块中定义。

If you create a new DLL project in Visual C++ from scratch, and check the check box "Export symbols", some sample code will be generated using this technique.如果您从头开始在 Visual C++ 中创建一个新的 DLL 项目,并选中“导出符号”复选框,则将使用此技术生成一些示例代码。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM