(转)显式加载DLL并使用 DLL 中的类

首先需要 强调 ,当使用某个 类时 一般目的有二: 例化成 象或者 承它 生新
于前者,我 可以构造一个抽象 java 里的接口)来 用方和 DLL
 
抽象
// Interface.h 公共文件 /
#pragma once
 
class Interface
{
public :
     virtual void ShowMsg() = 0; // 用方需要 用的成 函数声明成 虚函数
     virtual ~Interface(){};// 抽象 的虚析构函数
};
 
 
// Interface.cpp 用方文件
// 注意下面的代 并不是 实现 Interface ,而是因 为联 密才写在
#include "stdafx.h"
#include "Test.h"
#include "Interface.h"
 
// 过导 出函数形式向 用方提供指向派生 类对 象的基
extern "C" __declspec(dllexport) Interface* Export(void)
{
     return (Interface*)new Test();
}
 
将真正要 用的 声明成抽象 Interface 的派生
// Test.h 用方文件 //
// 的声明
#pragma once
#include "Interface.h"
class Test:public Interface
{
public :
     Test()
     virtual ~Test();
     virtual void ShowMsg(void);
private :
     CString s;
};
 
// Test.cpp 用方文件
// 实现
#include "stdafx.h"
#include "Test.h"
 
Test::Test()
{
     s = "hello form dll";
}
 
Test::~Test()
{
     AfxMessageBox(_T("destructor"));
}
 
void Test::ShowMsg()
{
     AfxMessageBox(s);
}
 
用方 DLL 时动态
// 用方文件 /
#include "stdafx.h"
#include "Interface.h" // 包含抽象 从而使用接口
 
// 添加如下代
     HINSTANCE hDll;
     hDll = LoadLibrary(_T("module1.dll"));// DLL 文件, DLL 名称和路径用自己的
     if(hDll == NULL)
     {
         TRACE("/n/nload dll fail/n/n");
         return;
     }
     typedef Interface*(*pExport)(void); // 指向 出函数的指 针类
     pExport Get;
     Get = (pExport)GetProcAddress(hDll,"Export");// 将指 指向函数首地址
     if(Get == NULL)
     {
         TRACE("/n/nload address fail/n/n");
         return;
     }
    
     Interface *t = Get();// 出函数 得抽象
     t->ShowMsg();// 过该 针调 函数
     delete t; // DLL 中生成的
     FreeLibrary(hDll); // 句柄
 
 
写到 第一个目的达到了。其 将需要 用的 的指 直接 出更 简单 ,但是使用抽象 接口
却更加 雅,思路也比 清晰(在 方面 java 舒服)。
 
     至于 DLL 中的 ,最好的方法是使用 DLL 。其 们应该 尽量避免 DLL 中的
动态链 库顾 名思 是可以随 更新 动态链 接到程序的模 块库 ,目的是方便程序的模 化和
更新。而 承的本意是 实现 ,多 的基 就是所有同一基 的派生 可以通 相同
访问 ,基 是所有派生 的抽象,是基石,是很少甚至不可改 的。因此把基 放在
动态链 ,然后从外面去 承他是不明智也是很奇怪的。
 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值