zoukankan      html  css  js  c++  java
  • Windows API封装:LoadLibrary/FreeLibrary

    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() );
  • 相关阅读:
    Android应用程序注冊广播接收器(registerReceiver)的过程分析
    智能生活 “视”不可挡——首届TCL杯HTML5智能电视开发大赛等你来挑战
    点滴的积累---J2SE学习小结
    公开课
    iOS学习之 plist文件的读写
    【STL】关联容器 — hash_set
    《Pro Android Graphics》读书笔记之第三节
    第一章. ActionScript 语言基础
    JAVA数组的定义及用法
    MS-SQLSERVER中的MSDTC不可用解决方法
  • 原文地址:https://www.cnblogs.com/zhaodahai/p/6825514.html
Copyright © 2011-2022 走看看