LoadLibrary/LoadLibraryEx用来加载DLL到自己的进程空间,使用完用FreeLibrary释放,一般使用方式如下:

   HINSTANCE hInstRich = ::LoadLibrary(CRichEditCtrl::GetLibraryName());
   ATLASSERT(hInstRich != NULL);
   
    ::FreeLibrary(hInstRich);

若使用过程中遇到跳转语句,即使不忘记 FreeLibrary,代码也会变得相当难看.一种优雅的封装方式如下(原理同智能指针):

class CLoadLibrary
{
public:
   HINSTANCE m_hInst;

CLoadLibrary(HINSTANCE hInst = NULL) : m_hInst(hInst)
   {
   }

CLoadLibrary(LPCTSTR pstrFileName) : m_hInst(NULL)
   {
      Load(pstrFileName);
   }
   
   ~CLoadLibrary()
   {
      Free();
   }
   
   BOOL Load(LPCTSTR pstrFileName, DWORD dwFlags = 0)
   {
      ATLASSERT(!::IsBadStringPtr(pstrFileName, MAX_PATH));
      Free();
      m_hInst = ::LoadLibraryEx(pstrFileName, NULL, dwFlags);
      return m_hInst != NULL;
   }
   
   void Free()
   {
      if( IsLoaded() ) {
         ::FreeLibrary(m_hInst);
         m_hInst = NULL;
      }
   }
   
   HINSTANCE Detach()
   {
      HINSTANCE hInst = m_hInst;
      m_hInst = NULL;
      return hInst;
   }
   
   BOOL IsLoaded() const 
   { 
      return m_hInst != NULL; 
   }
   
   FARPROC GetProcAddress(LPCSTR pszFuncName) const
   { 
      ATLASSERT(!::IsBadStringPtrA(pszFuncName,-1));
      ATLASSERT(IsLoaded()); 
      return ::GetProcAddress(m_hInst, pszFuncName);
   }
   
   BOOL GetFileName(LPTSTR pstrFilename, DWORD cchMax = MAX_PATH) const
   {
      ATLASSERT(IsLoaded());
      return ::GetModuleFileName(m_hInst, pstrFilename, cchMax);
   }
   
   operator HINSTANCE() const
   { 
      return m_hInst; 
   }
};

应用这个封装,上述示例即可这样写:

   CLoadLibrary  loadEditDll( CRichEditCtrl::GetLibraryName() );
   ATLASSERT( loadEditDll.IsLoaded() );

Windows API封装:LoadLibrary/FreeLibrary的更多相关文章

  1. LoadLibrary文件路径及windows API相关的文件路径问题

    LoadLibrary HMODULE WINAPI LoadLibrary( _In_  LPCTSTR lpFileName ); Loads the specified module into ...

  2. Windows API Hook

    原文地址:http://blog.sina.com.cn/s/blog_628821950100xmuc.html 原文对我的帮助极大,正是由于看了原文.我才学会了HOOK.鉴于原文的排版不是非常好, ...

  3. Windows API 函数列表 附帮助手册

    所有Windows API函数列表,为了方便查询,也为了大家查找,所以整理一下贡献出来了. 帮助手册:700多个Windows API的函数手册 免费下载 API之网络函数 API之消息函数 API之 ...

  4. Windows API Finishing

    input { font-size: 14px; height: 26px } td { border-style: none; border-color: inherit; border-width ...

  5. Windows API函数大全(完整)

    Windows API函数大全,从事软件开发的朋友可以参考下 1. API之网络函数 WNetAddConnection 创建同一个网络资源的永久性连接 WNetAddConnection2 创建同一 ...

  6. [windows菜鸟]Windows API函数大全(完整)

    Windows API函数大全,从事软件开发的朋友可以参考下 1. API之网络函数 WNetAddConnection 创建同一个网络资源的永久性连接 WNetAddConnection2 创建同一 ...

  7. WINDOWS API 大全(二)

    9. API之设备场景函数 CombineRgn 将两个区域组合为一个新区域CombineTransform 驱动世界转换.它相当于依顺序进行两次转换CreateCompatibleDC 创建一个与特 ...

  8. Windows API Hooking in Python

    catalogue . 相关基础知识 . Deviare API Hook Overview . 使用ctypes调用Windows API . pydbg . winappdbg . dll inj ...

  9. C#调用windows API的一些方法

    使用C#调用windows API(从其它地方总结来的,以备查询) C#调用windows API也可以叫做C#如何直接调用非托管代码,通常有2种方法: 1.  直接调用从 DLL 导出的函数. 2. ...

随机推荐

  1. python教程(一)·python环境搭建

    python的环境搭建总的来说分为两大步:下载.安装(废话@_@).在这里以windows为例(Linux通常内置了python,就算没有内置,相信Linux用户也非常清楚软件的安装方法) 第一步-下 ...

  2. PHP array_reduce()函数的应用解析

    实例 向用户自定义函数发送数组中的值,并返回一个字符串: <?php function myfunction($v1,$v2) { return $v1 . "-" . $v ...

  3. C指针(3)——指向指针的指针(程序讲解)

    int **q可以分成两部分,即int* 和 (*q),后面的 “q” 中的* 表示q是一个指针变量,前面的int*表示指针变量q只能存放int*型变量的地址.int** q表示为指针变量q只能存放i ...

  4. 说说CakePHP的关联模型之一 基本关联

    一个无论多么复杂的程序,拆开看无非是三种逻辑结构的组合:顺序结构.条件结构和循环结构. 类似的,数据库中表与表的之间的关联无外乎四种:一对一.一对多.多对一和多对多. CakePHP的模型层中定义了四 ...

  5. 【JUC源码解析】Exchanger

    简介 Exchanger,并发工具类,用于线程间的数据交换. 使用 两个线程,两个缓冲区,一个线程往一个缓冲区里面填数据,另一个线程从另一个缓冲区里面取数据.当填数据的线程将缓冲区填满时,或者取数据的 ...

  6. 在Win10中通过命令行打开UWP应用

    近期由于需要在WinX菜单中添加几个UWP应用,但发现很难找到相应的命令行,Universal Apps 的快捷方式属性里也没有. 于是到网上搜了很久才找到一个E文的页面,试了一下确实可行,分享给大家 ...

  7. hdu1061Rightmost Digit(快速幂取余)

    Rightmost Digit Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)T ...

  8. Qt-QML-Connections,接受组件信号

    这里还没有什么新的体会.就直接上代码,在上篇一处上改出来的 import QtQuick 2.5 import QtQuick.Controls 1.4 ApplicationWindow { vis ...

  9. Unity编辑器 - DragAndDrop拖拽控件

    Unity编辑器 - DragAndDrop拖拽控件 Unity编辑器的拖拽(DragAndDrop)在网上能找到的资料少,自己稍微研究了一下,写了个相对完整的案例,效果如下 代码: object d ...

  10. Shader Forge学习

    最近学习了一下shader forge,一个屌屌哒插件用来生成shader.尽管其降低了制作shader的难度,但是真的想做出满意的shader的话还是得有一定的shader基础.但是仅仅是做出一些简 ...