热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

(转)显式加载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 中的
动态链 库顾 名思 是可以随 更新 动态链 接到程序的模 块库 ,目的是方便程序的模 化和
更新。而 承的本意是 实现 ,多 的基 就是所有同一基 的派生 可以通 相同
访问 ,基 是所有派生 的抽象,是基石,是很少甚至不可改 的。因此把基 放在
动态链 ,然后从外面去 承他是不明智也是很奇怪的。
 

推荐阅读
  • 实体映射最强工具类:MapStruct真香 ... [详细]
  • UNP 第9章:主机名与地址转换
    本章探讨了用于在主机名和数值地址之间进行转换的函数,如gethostbyname和gethostbyaddr。此外,还介绍了getservbyname和getservbyport函数,用于在服务器名和端口号之间进行转换。 ... [详细]
  • 本次考试于2016年10月25日上午7:50至11:15举行,主要涉及数学专题,特别是斐波那契数列的性质及其在编程中的应用。本文将详细解析考试中的题目,并提供解题思路和代码实现。 ... [详细]
  • 本题旨在通过给定的评级信息,利用拓扑排序和并查集算法来确定全球 Tetris 高手排行榜。题目要求判断是否可以根据提供的信息生成一个明确的排名表,或者是否存在冲突或信息不足的情况。 ... [详细]
  • 扫描线三巨头 hdu1928hdu 1255  hdu 1542 [POJ 1151]
    学习链接:http:blog.csdn.netlwt36articledetails48908031学习扫描线主要学习的是一种扫描的思想,后期可以求解很 ... [详细]
  • 题目Link题目学习link1题目学习link2题目学习link3%%%受益匪浅!-----&# ... [详细]
  • 本实验主要探讨了二叉排序树(BST)的基本操作,包括创建、查找和删除节点。通过具体实例和代码实现,详细介绍了如何使用递归和非递归方法进行关键字查找,并展示了删除特定节点后的树结构变化。 ... [详细]
  • 本文详细探讨了VxWorks操作系统中双向链表和环形缓冲区的实现原理及使用方法,通过具体示例代码加深理解。 ... [详细]
  • 本题涉及一棵由N个节点组成的树(共有N-1条边),初始时所有节点均为白色。题目要求处理两种操作:一是改变某个节点的颜色(从白变黑或从黑变白);二是查询从根节点到指定节点路径上的第一个黑色节点,若无则输出-1。 ... [详细]
  • 本题通过将每个矩形视为一个节点,根据其相对位置构建拓扑图,并利用深度优先搜索(DFS)或状态压缩动态规划(DP)求解最小涂色次数。本文详细解析了该问题的建模思路与算法实现。 ... [详细]
  • 在多线程编程环境中,线程之间共享全局变量可能导致数据竞争和不一致性。为了解决这一问题,Linux提供了线程局部存储(TLS),使每个线程可以拥有独立的变量副本,确保线程间的数据隔离与安全。 ... [详细]
  • 作者:守望者1028链接:https:www.nowcoder.comdiscuss55353来源:牛客网面试高频题:校招过程中参考过牛客诸位大佬的面经,但是具体哪一块是参考谁的我 ... [详细]
  • 本文介绍了一种解决二元可满足性(2-SAT)问题的方法。通过具体实例,详细解释了如何构建模型、应用算法,并提供了编程实现的细节和优化建议。 ... [详细]
  • 20100423:Fixes:更新批处理,以兼容WIN7。第一次系统地玩QT,于是诞生了此预备式:【QT版本4.6.0&#x ... [详细]
  • 本文详细介绍了如何在C#程序运行期间防止系统进入休眠模式以及显示器关闭,提供了具体的实现代码示例,并解释了其应用场景。这不仅有助于提高程序的稳定性,还能优化能源管理。适合需要处理长时间任务(如下载或批处理)的开发者参考。 ... [详细]
author-avatar
yanghuimin
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有