这个东东就是对 win32api中的dll调用接口进行了2次封装,增加了面向对象特性。
本人水平一般,见笑了。
开发环境:winxp sp3 + vs2008
DynamicDllManager.h
/*---------------------------------------------------------------------------------------
文件: DynamicDllManager.h
创建日期: 2010.1.12
作者: linshenqi
描述: 该类是一个动态dll加载管理器,编译后生成DynamicDllManager.dll,
DynamicDllManager.lib以供调用。
-----------------------------------------------------------------------------------------
版本 | 日期 | 描述
------------|-------------------|--------------------------------------------------------
1.0 | 2010.1.12 | 首次开发,实现基本功能。
------------|-------------------|--------------------------------------------------------
1.1 | 2010.3.2 | 增加了错误回收,完善源代码。
---------------------------------------------------------------------------------------*/
#pragma once
#include<windows.h>
#include<map>
#define DLL_ERR_LOAD_NAMED 0x0001 //重命名
#define DLL_ERR_LOAD_NOTEXISTED 0x0002 //DLL不存在
#define DLL_ERR_UNLOAD_NOTEXISTED 0x0003 //DLL句柄不存在
class _declspec(dllexport) DynamicDllManager
{
private:
int m_nDllNum; //已加载的dll数量
std::map<char *, HMODULE> m_mpDllPool; //dll调用池
DWORD m_nError; //错误
public:
DynamicDllManager(void);
~DynamicDllManager(void);
int GetDllNum(void); //获取已加载的dll数量
DWORD LoadDll(const char *sDllName, const char *sDllPath); //加载dll
DWORD UnloadDll(const char *sDllName); //卸载dll
HMODULE GetProc(const char *sDllName); //获取dll句柄
DWORD GetLastError(void); //返回最后一次错误
};
DynamicDllManager.cpp
#include "StdAfx.h"
#include "DynamicDllManager.h"
DynamicDllManager::DynamicDllManager(void)
{
this->m_nDllNum = 0;
this->m_nError = 0;
}
DynamicDllManager::~DynamicDllManager(void)
{
}
int DynamicDllManager::GetDllNum(void)
{
return this->m_nDllNum;
}
DWORD DynamicDllManager::LoadDll(const char *sDllName, const char *sDllPath)
{
for(std::map<char *, HMODULE>::iterator piter = this->m_mpDllPool.begin();
piter != this->m_mpDllPool.end(); ++piter)
{
if(0 == strcmp(piter->first, sDllName))
{
this->m_nError = DLL_ERR_LOAD_NAMED;
return DLL_ERR_LOAD_NAMED;
}
}
HMODULE hDll = NULL;
hDll = ::LoadLibrary(sDllPath);
if(NULL == hDll)
{
this->m_nError = DLL_ERR_LOAD_NOTEXISTED;
return DLL_ERR_LOAD_NOTEXISTED;
}
this->m_mpDllPool.insert(std::pair<char *, HMODULE>((char *)sDllName, hDll));
this->m_nDllNum++;
return 0;
}
DWORD DynamicDllManager::UnloadDll(const char *sDllName)
{
for(std::map<char *, HMODULE>::iterator piter = this->m_mpDllPool.begin();
piter != this->m_mpDllPool.end(); ++piter)
{
if(0 == strcmp(piter->first, sDllName))
{
::FreeLibrary(piter->second);
this->m_mpDllPool.erase(piter);
this->m_nDllNum--;
return 0;
}
}
this->m_nError = DLL_ERR_UNLOAD_NOTEXISTED;
return DLL_ERR_UNLOAD_NOTEXISTED;
}
HMODULE DynamicDllManager::GetProc(const char *sDllName)
{
for(std::map<char *, HMODULE>::iterator piter = this->m_mpDllPool.begin();
piter != this->m_mpDllPool.end(); ++piter)
{
if(0 == strcmp(piter->first, sDllName))
{
return piter->second;
}
}
return NULL;
}
DWORD DynamicDllManager::GetLastError(void)
{
return this->m_nError;
}
调用:
假设在项目路径下有一个Calc.dll
#include "DynamicDllManager.h"
void main
{
DynamicDllManager ddm;
if(0 != ddm.LoadDll("calc", "Calc.dll"))
{
printf("err\n");
getchar();
return;
}
printf("%d\n", ddm.GetDllNum());
typedef double (*pShow)(const char *);
pShow Show=(pShow)::GetProcAddress(ddm.GetProc("calc"), "Calc");
if(NULL == Show)
{
printf("err");
getchar();
return;
}
printf("%.2f\n", Show("4*32"));
if(0 != ddm.UnloadDll("calc"))
{
printf("err\n");
getchar();
return;
}
printf("%d\n", ddm.GetLastError());
printf("%d\n", ddm.GetDllNum());
}
分享到:
相关推荐
动态链接库(DLL,Dynamic Link Library)是Windows操作系统中一种重要的共享代码库,它包含了一系列可执行函数和资源,供多个程序同时调用,以节省内存并提高系统效率。DLL查看器是一种工具软件,用于帮助用户查看...
API-MS-WIN一系列丢失DLL打包 dll列表 api-ms-win-core-console-l1-1-0.dll api-ms-win-core-datetime-l1-1-0.dll api-ms-win-core-debug-l1-1-0.dll api-ms-win-core-errorhandling-l1-1-0.dll api-ms-win-core-...
- 动态加载DLL与静态加载不同,静态加载在编译时就已经将DLL与应用程序绑定。而动态加载则是在运行时根据需要加载DLL,可以减少程序启动时的内存占用,也便于更新或替换DLL。 - 在VB6中,通过`LoadLibrary`和`...
DLL(Dynamic Link Library)是Windows操作系统...总之,一个优秀的DLL加载器不仅简化了DLL的管理和使用,还为开发者和普通用户提供了一个安全、灵活的环境,使得DLL的功能得到充分利用,同时降低了系统维护的复杂性。
在Windows 64位环境下,"sqlite-dll-win64-x64-3350100.zip" 文件代表的是SQLite的动态链接库(DLL)版本,适用于64位(x64)的Windows平台。这里的"3350100"是SQLite的版本号,表示这是到2021年为止的一个较新的...
cygattr-1.dll cygbz2-1.dll cygform-10.dll cygformw-10.dll cyggcc_s-1.dll cyggmp-3.dll cyghistory7.dll cygicons-0.dll cygiconv-2.dll cygintl-8.dll cyglsa.dll cyglsa64.dll cyglzma-5.dll cygmagic-1.dll ...
在实际部署时,确保sigar-amd64-winnt.dll或sigar-x86-winnt.dll与sigar.jar位于同一目录下,或者根据Java的系统属性`java.library.path`指定dll文件的路径,以便Java虚拟机能够找到并加载它们。 总之,Sigar提供了...
DLL加载器则是一个专门用于管理和执行DLL文件的工具,它允许开发者或者普通用户在不依赖特定应用程序的情况下,独立地加载和调试这些动态链接库。 在Windows中,DLL加载器主要由系统本身提供的,如NTDLL.DLL、...
API-MS-WIN-CORE-LIBRARYLOADER-L1-2-0.dll是Windows NT内核库加载器API的一个版本,它包含了用于加载和管理应用程序依赖的动态链接库的核心功能。这些功能包括但不限于: 1. 加载和卸载DLL:当一个程序启动时,库...
总的来说,"sqlite-dll-win64-x64"是一个关键组件,对于在64位Windows环境中构建和运行依赖SQLite数据库的应用程序至关重要。配合sqlite3.def文件,开发者可以方便地在自己的程序中利用SQLite的强大功能。
api-ms-win-core-libraryloader-l1-2-0.dll文件是Windows操作系统的核心动态链接库之一,它提供了与加载和卸载动态链接库(DLL)相关的函数和功能。 该DLL文件包含了一些与库加载和管理相关的函数,例如LoadLibrary...
"jacob-1.18-x64.dll" 和 "jacob-1.18-x86.dll" 是Jacob库的动态链接库文件,分别对应于64位和32位的Windows操作系统。Jacob的核心功能就是通过这些DLL文件来实现Java和COM接口的通信。 "jacob.jar" 是Jacob的Java...
这个“dll中加载form窗体 - DELPHI版.rar”压缩包提供了一个DElphi7的实例,展示了如何在DLL中创建和加载一个窗体,并在主应用程序中显示和交互。下面将详细介绍这一技术。 1. **DLL的基本概念** DLL文件是一个...
2. **获取函数地址**:在易语言中,使用“动态链接库”模块,通过“加载动态链接库”命令加载DLL,并通过“获取动态链接库函数地址”命令获取DLL中导出函数的地址。 3. **注入DLL**:注入DLL通常通过以下两种方式...
- **调用场景**:当一个进程尝试调用DLL中的函数时,系统开始加载DLL。 - **搜索路径**:系统首先检查调用进程的当前工作目录,然后是系统的系统目录,接着是注册表中指定的路径,最后是动态链接库的搜索路径环境...
本主题聚焦于如何利用中望CAD制作一个能够通过netload加载DLL插件的功能,以便实现动态读取配置菜单。这样的功能对于提高工作效率、自定义用户界面以及适应特定项目需求具有重要意义。 首先,我们需要理解DLL...
Jacob是一个Java到COM(Component Object Model)桥接器,它允许Java应用程序调用Windows平台的COM组件,实现Java与COM之间的互操作性。 描述中提到的"jacob"是Jacob项目的简称,而"1.17-M2"是其版本号。在这个版本...
总结,DLL动态加载是.NET平台上的一个重要特性,它允许程序在运行时动态地添加功能或修复错误。在使用过程中需要注意DLL路径、函数签名、异常处理和资源管理。在实际开发中,遇到问题如“button3”提示的错误,应从...
标题中的"sqlite-dll-win64-x64-3180000.zip"表明这是针对64位Windows系统的一个SQLite版本,版本号为3180000。"dll"意味着这是一个动态链接库文件,它包含了SQLite的运行时组件,可以让其他应用程序调用其功能。预...
当一个程序需要使用DLL中的功能时,它并不将整个DLL加载到内存中,而是只加载必要的部分。这样可以减少内存消耗,因为多个程序可以共享同一DLL的内存映像。 2. **DLL的加载** - **静态链接**:在编译时,程序会将...