`
lovnet
  • 浏览: 6693548 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

动态链接库(dynamic link lib)加载的模板实现

 
阅读更多

当一个大的应用程序要加载不同动态库,但是这些动态库的入口接口相同或者相似,就需要用模板来管理加载动态库类。例如一个基于2个设备开发的应用程序,至少需要有2层,第一层是设备的驱动程序(用动态库DLL表示),第二层需要在初始化2个设备的时候同时加载这两个库。而这2个动态库入口接口一个参数为设备名,一个参数为设备所对应的对象接口。这个时候动态库入口函数就可以写成typedef int (*pDll)(const char* pName, DllInterface *&pCallor); DllInterface 为模板类声明。具体实现参考以下代码:

template<class DllInterface>
class CDllLoader
{
private:
typedef int (*pDll)(const char* pName, DllInterface *&pCallor);//动态库入口接口定义

//库资源的释放和接口指针释放
void Release()
{
if (m_interface != NULL)
{
m_interface = NULL;
}

if (hDll != NULL)
{
FreeLibrary(hDll);
hDll = NULL;
}
}

public:
CDllLoader()
{
hDll = NULL;
m_interface = NULL;
}

virtual ~CDllLoader()
{
Release();
}

int load(const char* szDllName,const char* szCreateFunctionName,const char* pClassName = NULL)
{
hDll = LoadLibrary(szDllName);

if (hDll)
{
return 1;
}

pDll *pCreate = (pDll)GetProcAddress(hDll,szCreateFunctionName);

if (pCreate == NULL)
{
Release();
return 2;
}

int nRet = pCreate(pClassName,m_interface);

if (nRet < 0)
{
Release();
return nRet;
}
return 0;
}

DllInterface* operator->()
{
return m_interface;
}

bool operator==(DllInterface* p)
{
return m_interface == p;
}

bool operator!=(DllInterface* p)
{
return m_interface != p;
}

bool operator!()
{
return !m_interface;
}
protected:
HINSTANCE hDll;//库实例对象
DllInterface *m_interface; //接口对象,指向动态库中导出的类对象
};

分享到:
评论

相关推荐

    动态链接库dynamic link library

    VC++2008制作。 展示动态链接库的制作和使用!! 动态链接库深入浅出!! 定义出口函数和入口函数!!

    VC动态链接库(Dynamic_Link_Libraries

    VC动态链接库(Dynamic_Link_Libraries

    windows动态链接库.rar

    Dynamic Link Library,即动态链接库,是Microsoft在Windows操作系统中实现共享函数库概念的一种实现方式,这种库包含了可由多个程序同时使用的代码和数据 它其中windows中 一些作为DLL实现的文件有:ActiveX控件(....

    VC++写动态链接库教程

    静态链接库与动态链接库都是共享代码的方式,如果采用静态链接库,则无论你愿不愿意,lib中的指令都被直接包含在最终生成的EXE文件中了。但是若使用DLL,该DLL不必被包含在最终EXE文件中,EXE文件执行时可以“动态”...

    动态链接库(DLL)编程深入浅出

    静态链接库与动态链接库都是共享代码的方式,如果采用静态链接库,则无论你愿不愿意,lib中的指令都被直接包含在最终生成的EXE文件中了。但是若使用DLL,该DLL不必被包含在最终EXE文件中,EXE文件执行时可以“动态...

    VC 动态链接库(DLL)编程.rar

    静态链接库与动态链接库都是共享代码的方式,如果采用静态链接库,则无论你愿不愿意,lib 中的指令都被直接包含在最终生成的EXE 文件中了。但是若使用DLL,该DLL 不必被包含在最终EXE 文件中,EXE 文件执行时可以...

    VC++动态链接库(dll)编程深入浅出-----PDF和源码

     静态链接库与动态链接库都是共享代码的方式,如果采用静态链接库,则无论你愿不愿意,lib中的指令都被直接包含在最终生成的EXE文件中了。但是若使用DLL,该DLL不必被包含在最终EXE文件中,EXE文件执行时可以“动态...

    动态链接库的原理与设计

    静态链接库与动态链接库都是共享代码的方式,如果采用静态链接库,则无论你愿不愿意,lib中的指令都被直接包含在最终生成的EXE文件中了。但是若使用DLL,该DLL不必被包含在最终EXE文件中,EXE文件执行时可以“动态”...

    windows动态链接库编程详解.doc

    静态链接库与动态链接库都是共享代码的方式,如果采用静态链接库,则无论你愿不愿意,lib中的指令都被直接包含在最终生成的EXE文件中了。但是若使用DLL,该DLL不必被包含在最终EXE文件中,EXE文件执行时可以“动态”...

    VC++动态链接库(dll)编程深入浅出PDF

    静态链接库与动态链接库都是共享代码的方式,如果采用静态链接库,则无论你愿不愿意,lib中的指令都被直接包含在最终生成的EXE文件中了。但是若使用DLL,该DLL不必被包含在最终EXE文件中,EXE文件执行时可以“动态”...

    labview调用动态链接库相关说明文档,及调用PMAC动态链接库Pcomm32.DLL的例程

    labview调用动态链接库相关说明文档,及调用PMAC动态链接库Pcomm32.DLL的例程(labview called dynamic link library-related documentation, and call PMAC dynamic link library routines Pcomm32.DLL)

    动态链接库(C#).pdf

    动态链接库(也称为DLL,即为“Dynamic Link Library”的缩写)是Microsoft Windows最重要的组成要素之一,打开Windows系统文件夹,你会发现文件夹中有很多DLL文件,Windows就是将一些主要的系统功能以DLL模块的形式...

    动态链接库和MFC编程.zip

    动态链接库(Dynamic Link Library 或者 Dynamic-link Library,缩写为 DLL),是微软公司在微软Windows操作系统中,实现共享函数库概念的一种方式。这些库函数的扩展名是 ”.dll、.ocx(包含ActiveX控制的库)或者 ...

    动态链接库

    动态链接库英文为DLL,是Dynamic Link Library 的缩写形式,DLL是一个包含可由多个程序同时使用的代码和数据的库,DLL不是可执行文件.

    VC++动态链接库(DLL)编程深入浅出

     静态链接库与动态链接库都是共享代码的方式,如果采用静态链接库,则无论你愿不愿意,lib中的指令都被直接包含在最终生成的EXE文件中了。但是若使用DLL,该DLL不必被包含在最终EXE文件中,EXE文件执行时可以“动态...

    在动态库(dynamic libraries)和静态库(static libraries)使用模板(template)

    在动态库(dynamic libraries)和静态库(static libraries)使用模板(template)

    DLLs ( Dynamic Link Libraries) DLLs ( Dynamic Link Libraries)

    DLLs ( Dynamic Link Libraries) DLLs ( Dynamic Link Libraries)

    VC++ 生成动态链接库

    新建WIN32 Dynamic-link Library工程,工程名为MyDll,选择A simple DLL project类型。

    openssl 静态 链接库 libeay32.lib ssleay32.lib

    openssl 1.0.0b 的静态链接库 libeay32.lib ssleay32.lib,用他编译无需dll就可以运行。 网上找不到,自己动手弄的,需要的同学你懂的。 编译参数: /MT /Ox /O2 /Ob2 -O -DOPENSSL_NO_RC5 -DOPENSSL_NO_MD2 -...

    将Windows动态链接库移植到Linux-C/C++开发

    将Windows Dynamic Link库移植到Linux简介此存储库包含一个库,该库允许本机Linux程序从Windows DLL加载和调用函数。 作为演示,我已将Windows移植Windows动态链接库移植到Linux简介此存储库包含一个库,该库允许本...

Global site tag (gtag.js) - Google Analytics