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

本文介绍了一种通过抽象类接口实现DLL调用的方法,包括如何定义抽象类、派生具体实现类以及如何在调用方动态加载DLL并调用相应函数。此外,还讨论了继承DLL中类的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先需要强调,当使用某个类时一般目的有二:例化成象或者承它生新
于前者,我可以构造一个抽象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中的
动态链库顾名思是可以随更新动态链接到程序的模块库,目的是方便程序的模化和
更新。而承的本意是实现,多的基就是所有同一基的派生可以通相同
访问,基是所有派生的抽象,是基石,是很少甚至不可改的。因此把基放在
动态链,然后从外面去承他是不明智也是很奇怪的。
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值