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() );
  • 相关阅读:
    Bootstrap 2.2.2 的新特性
    Apache POI 3.9 发布,性能显著提升
    SQL Relay 0.48 发布,数据库中继器
    ProjectForge 4.2.0 发布,项目管理系统
    红帽企业 Linux 发布 6.4 Beta 版本
    红薯 快速的 MySQL 本地和远程密码破解
    MariaDB 宣布成立基金会
    Percona XtraBackup 2.0.4 发布
    Rocks 6.1 发布,光盘机群解决方案
    精通Servlet研究,HttpServlet的实现追究
  • 原文地址:https://www.cnblogs.com/fangkm/p/1445370.html
Copyright © 2011-2022 走看看