使用LoadLibrary动态加载DLL并使用其中的类

动态加载DLL并使用其中的函数,是大家经常用到的,那么直接使用LoadLibrary加载DLL来使用其中的类对象又该怎么做呢?本文给出方案&示例:

DLL - 头文件和导出方法

class IDLLIFsWrap
{
public:
    virtual void DeleteSelf(void) = 0;
    virtual int Add(int x, int y) = 0;
};

extern "C" __declspec(dllexport) long CreateIFsWrapObj(IDLLIFsWrap** ppObj);

DLL - 目标类的定义和实现

class CMyDLLIFsWrap : public IDLLIFsWrap
{
public:
    CMyDLLIFsWrap();
    virtual ~CMyDLLIFsWrap();
    virtual void DeleteSelf(void);
    virtual int Add(int x, int y);
};

long CreateIFsWrapObj(IDLLIFsWrap** ppObj)
{
    *ppObj = new CMyDLLIFsWrap();
    return 0;
}

CMyDLLIFsWrap::CMyDLLIFsWrap()
{
}
CMyDLLIFsWrap::~CMyDLLIFsWrap()
{
}

void CMyDLLIFsWrap::DeleteSelf(void)
{
    delete this;
}

int CMyDLLIFsWrap::Add(int x, int y)
{
    return x + y;
}

Demo - 使用DLL

class CMyDemoDlg : public CDialogEx
{
... ...
public:
    afx_msg void OnBnClickedOk();
    afx_msg void OnClose();

private:
    BOOL InitializeMyDLL();
    void UnInitializeMyDLL();

private:
    HINSTANCE           m_myDllHInst;
    IDLLIFsWrap*        m_pIFsWrapObj;
}

BOOL CMyDemoDlg::OnInitDialog()
{
... ...
InitializeMyDLL();
return TRUE;
}

void CMyDemoDlg::OnClose()
{
    UnInitializeMyDLL();

    CDialogEx::OnClose();
}
void CMyDemoDlg::OnBnClickedOk()
{
    if (nullptr != m_pIFsWrapObj)
    {
        int nRet = m_pIFsWrapObj->Add(3, 4);
        TRACE(_T("%d\n"), nRet);
    }
}

BOOL CMyDemoDlg::InitializeMyDLL()
{
    typedef long (*FunCreateIFsWrapObj)(IDLLIFsWrap **pp_obj);
    m_myDllHInst = LoadLibrary(_T("MyDLL.dll"));

    if (nullptr == m_myDllHInst)
        return FALSE;

    FunCreateIFsWrapObj funCreateObj = (FunCreateIFsWrapObj)GetProcAddress(m_myDllHInst, "CreateIFsWrapObj");
    if (nullptr == funCreateObj)
    {
        FreeLibrary(m_myDllHInst);
        m_myDllHInst = nullptr;
        return FALSE;
    }

    if (0 != funCreateObj(&m_pIFsWrapObj))
    {
        ASSERT(nullptr == m_pIFsWrapObj);
        FreeLibrary(m_myDllHInst);
        m_myDllHInst = nullptr;
        return FALSE;
    }

    ASSERT(nullptr != m_myDllHInst);
    ASSERT(nullptr != m_pIFsWrapObj);

    return TRUE;
}

void CMyDemoDlg::UnInitializeMyDLL()
{
    if (nullptr != m_pIFsWrapObj)
    {
        m_pIFsWrapObj->DeleteSelf();
        m_pIFsWrapObj = nullptr;
    }

    if (nullptr != m_myDllHInst)
    {
        FreeLibrary(m_myDllHInst);
        m_myDllHInst = nullptr;
    }
}
  • 7
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值