C++ dll动态库(多态使用dll)

123 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第15天,点击查看活动详情

Dll是一个作为函数和资源的共享库,但是dll不是单独的可执行文件,他需要使用在程序之中,用于分享自己的接口,并且在内部对其参数进行操作。

在新建dll时,可以在vs上直接选择dll项目,他的所有配置内部都会自己创建,它使用起来和qt一样,写好自己的逻辑以及回调函数之类的接口的内容就好。但是在相同的接口下做不同的逻辑操作时就需要多态了。如果只是把多态的基类以及他的派生类全部都写在同一个.cpp下,他最后生成的dll文件会非常的大。我们可以新建多个新的cpp文件,在我们不用的时候删除他所生成的dll,他所占的内存就会小很多。

 

由于两个.h需要互相包含,所以必须使用下面的方法。否则会出现重定义的问题。

Mydll.h

#pragma once

#include "iostream"

 

typedef *VOID*(*Show)(*LPSTR* uiName);

// 设置Show的回调函数给DLL,供DLL回调

*EXTERN_C* Dll2_API void _stdcall SetShowCallback(ShowUI show);

*EXTERN_C* Dll2_API void _stdcall Init();

//基类

class BaseClass

{

public:

    BaseClass();

    ~BaseClass();

public:

    virtual void Init()=0;          //初始化

};

 

Mydll.cpp

BaseClass* p;

Show show = *NULL*;

 

注意:对函数指针的声明一定要写到cpp中,不然会出现重定义问题。

 

Myuse.h

#ifdef __cplusplus

extern "C" {

#endif

 

class MyUse : public BaseClass

{

public:

    MyUse();

    ~MyUse();

 

public:

    void Init();            //初始化

 

#ifdef __cplusplus

}

#endif

extern "C"的主要作用就是为了能C够正确实现C++代码调用其他C语言代码。加上extern "C"后,会指示编译器这部分代码按C语言(而不是C++)的方式进行编译。  

Myuse.cpp

 

extern Show show;

 

这里要注意的是 在Myuse中使用Mydll的函数指针时,一定一定要在Myuse.cpp中再次声明,不然一直会有冲定义的问题。 由于我的两个头文件总是互相包含,所以必须在include之前写上#pragma once

,他就是为了避免同一个头文件多次被包含而使用的宏。