• 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() );
  • 相关阅读:
    IE盒子模型和标准W3C盒子模型
    [转载] MVC3自定义标签,给Html.ActionLink加上支持图片链接的功能
    MVC3获取登录用户名
    [转]APS.netMVC的ViewModel问题
    [转载]Js小技巧||给input type=“password”的输入框赋默认值
    [资料]aspnetdb.mdf数据库的建立和使用
    [转] .net网页中插入Flash
    [转]Membership、MembershipUser和Roles类
    [小技巧]提交按钮
    asp.net mvc中session的使用 样例
  • 原文地址:https://www.cnblogs.com/fangkm/p/1445370.html
Copyright © 2020-2023  润新知