一个动态的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());
}

你可能感兴趣的:(C++,c,windows,C#,项目管理)