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. linux 通过 openconnect 来连接学校内网

    参考 http://xingda1989.iteye.com/blog/1969908 https://blog.csdn.net/edin_blackpoint/article/details/70 ...

  2. ubuntu安装cuda、cudnn

    环境: Ubuntu 16.04.4 LTS CUDA:8.0 CUDNN:5.1 CUDA下载:https://developer.nvidia.com/cuda-80-ga2-download-a ...

  3. Java中的File.separator用法

    在Windows下的路径分隔符和Linux下的路径分隔符是不一样的,当直接使用绝对路径时,跨平台会暴出“No such file or diretory”的异常. 比如说要在temp目录下建立一个te ...

  4. stylus , another css processor

    1. install from npm sudo npm install stylus 2. create a styl file named step1.styl border-radius() { ...

  5. 【LG4735】最大异或和

    [LG4735]最大异或和 题意 洛谷 题解 维护一个前缀异或和\(S_i\) 对于一个询问操作\(l\).\(r\).\(x\) 就是等价于求一个位置\(p\)(\(l\leq p \leq r)\ ...

  6. eclipse插件SCON的SConscript文件和头文件以及C文件包含路径

    1. 本次的头文件路径\Hi2110-B657SP3-SDK\src_release_657SP3\src\lib\onenet\public,以此例子作为研究,本次开发使用eclipse,用到SCO ...

  7. SpringBoot学习:整合MyBatis,使用Druid连接池

    项目下载地址:http://download.csdn.NET/detail/aqsunkai/9805821 (一)添加pom依赖: <!-- https://mvnrepository.co ...

  8. Pycharm中查看方法的源码

    方法1.鼠标放在函数上,Ctrl+B,看源码 方法2.将光标移动至要查看的方法处,按住ctrl 键,点击鼠标左键,即可查看该方法的源码.

  9. 【CentOS】下安装RabbitMQ教程

    系统版本: 安装依赖: 由于RabbitMQ依赖Erlang, 所以需要先安装Erlang. Erlang的安装方式大概有两种: (1) Erlang Solution安装(推荐) wget http ...

  10. webservice调用天气

    class WebServiceHelper { /// <summary> /// 动态调用WebService /// </summary> /// <param n ...