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() );


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM