一个动态的dll加载管理器--DynamicDllManager

这个东东就是对 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());
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值