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

推荐阅读
  • UNP 第9章:主机名与地址转换
    本章探讨了用于在主机名和数值地址之间进行转换的函数,如gethostbyname和gethostbyaddr。此外,还介绍了getservbyname和getservbyport函数,用于在服务器名和端口号之间进行转换。 ... [详细]
  • golang常用库:配置文件解析库/管理工具viper使用
    golang常用库:配置文件解析库管理工具-viper使用-一、viper简介viper配置管理解析库,是由大神SteveFrancia开发,他在google领导着golang的 ... [详细]
  • 实体映射最强工具类:MapStruct真香 ... [详细]
  • 本次考试于2016年10月25日上午7:50至11:15举行,主要涉及数学专题,特别是斐波那契数列的性质及其在编程中的应用。本文将详细解析考试中的题目,并提供解题思路和代码实现。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 本文介绍如何使用Objective-C结合dispatch库进行并发编程,以提高素数计数任务的效率。通过对比纯C代码与引入并发机制后的代码,展示dispatch库的强大功能。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 本文介绍了Java并发库中的阻塞队列(BlockingQueue)及其典型应用场景。通过具体实例,展示了如何利用LinkedBlockingQueue实现线程间高效、安全的数据传递,并结合线程池和原子类优化性能。 ... [详细]
  • 题目描述:给定n个半开区间[a, b),要求使用两个互不重叠的记录器,求最多可以记录多少个区间。解决方案采用贪心算法,通过排序和遍历实现最优解。 ... [详细]
  • 扫描线三巨头 hdu1928hdu 1255  hdu 1542 [POJ 1151]
    学习链接:http:blog.csdn.netlwt36articledetails48908031学习扫描线主要学习的是一种扫描的思想,后期可以求解很 ... [详细]
  • 题目Link题目学习link1题目学习link2题目学习link3%%%受益匪浅!-----&# ... [详细]
  • 本文详细探讨了VxWorks操作系统中双向链表和环形缓冲区的实现原理及使用方法,通过具体示例代码加深理解。 ... [详细]
  • 深入探讨CPU虚拟化与KVM内存管理
    本文详细介绍了现代服务器架构中的CPU虚拟化技术,包括SMP、NUMA和MPP三种多处理器结构,并深入探讨了KVM的内存虚拟化机制。通过对比不同架构的特点和应用场景,帮助读者理解如何选择最适合的架构以优化性能。 ... [详细]
  • 本题通过将每个矩形视为一个节点,根据其相对位置构建拓扑图,并利用深度优先搜索(DFS)或状态压缩动态规划(DP)求解最小涂色次数。本文详细解析了该问题的建模思路与算法实现。 ... [详细]
  • 本文详细介绍了一种通过MySQL弱口令漏洞在Windows操作系统上获取SYSTEM权限的方法。该方法涉及使用自定义UDF DLL文件来执行任意命令,从而实现对远程服务器的完全控制。 ... [详细]
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社区 版权所有