持续创作,加速成长!这是我参与「掘金日新计划 · 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
,他就是为了避免同一个头文件多次被包含而使用的宏。