从Windows 的动态库中引入类

一般从Windows的动态库引入类的方法比较简单,只需要在DLL的类的申明出加入EXPORT就可以,但是这种方法只限于编译的时候引入 DLL,就是通过Lib的方式引入DLL,但是很多情况下需要在程序的运行期来引入Dll,就像在程序运行的时候使用LoadLibrary获得动态库, 然后通过GetProcAddr来取得函数在库中的地址。怎样能够在运行的时候从动态库中引入类的申明呢?

首先在Windows下看一看如何做:

我们知道,在DLL中的类实际上只是一个类型的申明,他并没有实际的地址,所以希望通过地址来直接取出一个类的方法是无效的。虽然直接取不行,但是 可以使用间接的方法,我们可以在DLL中创建一个全局函数或者静态函数,用这个函数来创建一个类的对象,这样我们就可以使用该类了。

看这一段申明DLL的代码:

这个演示的类有两个成员函数,一个是init()函数,用来初始化成员变量,另一个是print()函数,用来输出成员变量。为了使这个类能够被外部程序使用,我们为她添加了两个成员函数,请见下面:

1.Create()函数,他用来创建一个MyClass的对象,并且返回一个指向该类的指针。
2.Destroy()函数,他用来销毁前面创建的MyClass的对象指针并释放资源。

通常一个类的所有成员函数都要在外部一一申明这样才可以使用,这里我们使用了一个技巧,就是把所有的Public属性的成员函数全部申明成virtual函数,利用虚函数自动与对象动态帮定的特性,这样在使用时直接引用对象的成员方法就可以了。

#define EXPORT  __declspec(dllexport)
class  MyClass{
    int x;
    int y;
public:
//把Create和Destroy方法申明为静态的和可供符号输出的
EXPORT static MyClass * Create()
    {
        return new MyClass();
    }
EXPORT static void Destroy(MyClass * mc)
    {
        delete mc;
    }
    virtual void init();
    virtual void print();
};
在主程序使用动态库中的类的方法:
首先定义函数指针类型
typedef MyClass* (*CreateMyClass)();
在主函数中:
//先LoadLibrary读取DLL库
    HINSTANCE hInstance = LoadLibrary("MyDll.dll");
   
//用普通的GetProcAddress方法取得Create函数的地址;
    CreateMyClass createMC =
        (CreateMyClass)(GetProcAddress(hInstance,
        MAKEINTRESOURCE(1)));
//然后用Create函数创建对象
    MyClass *d = createMC();
//下面就可以使用该对象了。
    d->init();
    d->print();

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yongjunhe

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值