MFC创建、调用Dll的方法

 

 

1. MFC创建DLL 


1. 打开VS,新建项目,选择“MFC动态链接库”,点击“下一步”。

 

2. 设置项目名,路径等参数,点击“创建”。

 

3. 选择“静态链接到MFC的规则DLL”->“完成”。

 

4. 以上步骤就将MFC Dll动态库的编译环境配置好了, 然后编写需要导出的函数,在MyDll.cpp中写入函数的实现:

extern "C" __declspec(dllexport) int MyAdd (int a, int b)
{
    return (a + b);
}


5. 接下来就是定义函数的导出接口了,也就是在头文件中声明这个函数

extern "C" __declspec(dllexport) int MyAdd(int a, int b);


6. 点击“生成”->“生成解决方案”,这样,在Debug路径下就生成了MyDll.dll和动态链接库MyDll.lib。

 

2. MFC调用DLL


1. 创建MFC应用程序,此处可根据需求设置工程参数,以下仅作为示例。

 

2. 配置项目路径和工程名等参数,点击“创建”。

 

3. 选择应用程序属性,“基于对话框”,“在静态库中使用MFC”,点击“完成”。

 

4. 在UI上添加一个按键“Add”,根据个人需求修改其属性,这里我修改了ID和显示的字符。

 

2.1 动态调用dll
        动态调用,即Run-time Dynamic Linking是一种隐式的调用方式,即程序运行过程中装载dll。该方式只需要.dll文件,不需要.h和.lib。通过LoadLibrary()加载.dll,GetProcAddress()获取想要引入的函数,使用完后通过就FreeLibrary()释放。

1. 双击“Add”控件进入槽函数,添加以下代码,然后生成解决方案。以下代码就是通过动态调用的方法调用dll。

void CTestMyDllDlg::OnBnClickedBtnAdd()
{
    // dynamic call dll
    HINSTANCE m_hDll = LoadLibrary(L"MyDll.dll");
 
    if (NULL == m_hDll)
    {
         MessageBox(L"Load dll failed!");
         return;
    }
    else
    {
         typedef int (*AddFun)(int a, int b);
         AddFun m_Add = (AddFun)GetProcAddress(m_hDll,"MyAdd");
         if (m_Add == NULL)
         {
             MessageBox(L"Find Add function failed!");
             return;
         }
         else
         {
             CString str = L"";
             int c = 0;
 
             c = m_Add(12, 13);
             str.Format(L"c = %d", c);
             MessageBox(str);
         }
         FreeLibrary(m_hDll);
    }
}

2. 运行.exe,点击“Add”控件,发现提示如下错误,那是因为我们没有将第一章生成的.dll文件添加到工程目录下。

 

将MyDll.dll复制到.exe路径下:

 

再次点击“Add”按键,结果如下:

 

2.2 静态调用dll
        静态调用,即 Load-time Dynamic Linking。正如我们常用的配置方式,同时需要.h、.lib和.dll文件,缺一不可。

1. 将MyDll.h复制到TestMyDll代码所在路径,并在TestMyDllDlg.cpp中将头文件include进来。

 

 

2. 修改“Add”控件槽函数,如下:

void CTestMyDllDlg::OnBnClickedBtnAdd()
{
    int c = 0;
    CString str = L"";
 
    c = MyAdd(1, 2);
    str.Format(L"c = %d", c);
    MessageBox(str);
}


3. 编译后发现,提示错误如下:

 

这是因为我们没有将.lib文件添加到工程中,接下来将介绍如何将.lib文件添加到工程中。

2.3 将.lib文件添加到工程

方法一:

右键工程->“添加”->“现有项”,选择MyDll.lib文件,直接将.lib文件添加到工程中。

 

重新编译运行,结果如下:

 

方法二:

将MyDll.lib复制到.exe所在路径下,若其它路径以下代码对应修改即可。

在TestMyDllDlg.cpp中添加如下代码

#pragma comment (lib, "../Debug/MyDll.lib")


重新编译运行,结果如下:

 

方法三:

1. 将MyDll.lib复制到.exe所在路径下

2. 在工程上右键->属性->配置属性->链接器->输入->附加依赖项,设置.lib文件所在路径,由于我们已经将.lib文件复制到工程Debug路径下,所以可以直接设置为:

$(SolutionDir)$(Configuration)\MyDll.lib


如果你没有将.lib复制到工程中,则直接设置其所在路径即可。

注意:这种方法需要对Debug和Release编译分别进行设置!

重新编辑运行,点击“Add”按键,结果如下:

 

3. MFC创建包含界面的DLL


1. 在MFC_Dll工程的基础上来修改,在资源视图上右键工程,为工程添加一个对话框:

 

2. 在生成的对话框上右键,为其添加类:

 

3. 根据需求修改对话框,这里添加一个static作为演示:

 

 

4. 在MyDlgDll.h中类之前添加__declspec(dllexport),将整个类导出。

 

5. 重新编译工程。

4. MFC调用包含界面的DLL


1. 根据上文介绍的方法,将.dll及.lib文件复制到TestMyDll工程指定目录下。

2. 将MyDlgDll.h复制到TestMyDll工程代码路径下。

3. #include包含DlgTest.h头文件。

4. 导入.lib文件,添加类实例,并在析构函数中释放内存。

 

 

参考代码:

#pragma comment(lib, "../Debug/MyDll.lib")
MyDlgDll* m_pMyDll = new MyDlgDll;
 
CTestMyDllDlg:: ~CTestMyDllDlg()
{
    if (m_pMyDll != NULL)
    {
        delete m_pMyDll;
        m_pMyDll = NULL;
    }
}


5. TestMyDll工程中添加一个按键“Dialog”,根据需要修改控件属性,双击进入槽函数,添加如下代码,实现对话框的创建和显示:

 

参考代码: 

void CTestMyDllDlg::OnBnClickedBtnDlg()
{
    if (m_pMyDll != NULL)
    {
        m_pMyDll->Create(IDD_DIALOG1);
        m_pMyDll->ShowWindow(SW_SHOW);
    }
}


由于在TestMyDll中没有IDD_DIALOG1的定义,因此自行添加一下宏定义即可。

6. 重新编译运行,点击“Dialog”,结果如下:

 

5. MFC创建C++类的DLL


1. 在上两章节,我们已经实现了包含界面的DLL的创建与调用,实际上,在MyDlgDll类中添加的public方法都可以同样的在外部被调用。在MyDlgDll.h中申明函数如下:

 

 2. 在MyDlgDll.cpp中添加函数定义,如下:

 

 参考代码:

int MyDlgDll::MyMul(int a, int b)
{
    return (a * b);
}


3. 重新编译。

6. MFC调用C++类的DLL


1. 参考上述MFC调用dll的步骤,将MyDll.dll和MyDll.lib添加到TestMyDll工程的Debug路径下;

2. 将MyDlgDll.h拷贝到TestMyDll的工程代码路径下;

3. TestMyDll工程中添加一个按键“Mul”,双击进入槽函数,添加如下代码:

 

参考代码:

void CTestMyDllDlg::OnBnClickedBtnMul()
{
    int c = 0;
    CString str = L"";
 
    if (m_pMyDll != NULL)
    {
        c = m_pMyDll->MyMul(12, 3);
    }
    str.Format(L"c = %d", c);
    MessageBox(str);
}


4. 重新编译运行,点击“Mul”按键,结果如下:


 

 

  • 4
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 在MFC工程中调用DLL中的对话框,需要进行以下步骤: 1. 在MFC工程的资源文件夹中创建一个对话框资源文件(.dlg)。 2. 编写一个导出函数,在该函数中创建并显示上述对话框,并将其作为返回值返回。 3. 在DLL代码中添加导出函数的定义和声明,可以使用__declspec(dllexport)声明该函数为导出函数。 4. 在MFC工程中使用LoadLibrary函数加载该DLL,并使用GetProcAddress函数获取导出函数的地址。 5. 使用获得的函数指针调用导出函数,获取对话框句柄并显示对话框。 6. 对话框处理完成后,调用EndDialog函数将结果返回给MFC工程。 通过上述步骤,就可以在MFC工程中调用DLL中的对话框了。需要注意的是,在使用DLL中的资源文件时,必须在MFC应用程序中调用AfxSetResourceHandle以确保使用正确的资源句柄。 ### 回答2: MFC是微软公司开发的一套基于Windows操作系统的应用程序框架。在MFC中,可以使用CDialog类创建对话框。DLL是一种动态链接库,它允许在不同的应用程序之间共享代码和数据。假设现在需要在MFC调用DLL中的对话框,则可以按照以下步骤进行操作: 1. 在DLL创建对话框 首先,在DLL创建一个对话框资源,并使用CDialog类派生一个对话框类。例如: class CDllDialog : public CDialog { public: CDllDialog(CWnd* pParent = NULL); enum { IDD = IDD_DLGDIALOG }; protected: virtual void DoDataExchange(CDataExchange* pDX); DECLARE_MESSAGE_MAP() }; 在此类中,可以根据需要添加控件和处理函数。 2. 在DLL中导出对话框类 接下来,需要在DLL中将对话框类导出,以便能够在MFC中使用。在DLL中添加以下代码: extern "C" __declspec(dllexport) CDialog* CreateDialog() { return new CDllDialog(); } 此代码将CreateDialog函数导出为一个公共的DLL函数,并返回一个CDllDialog对象。 3. 在MFC调用DLL中的对话框 现在,在MFC中可以使用以下代码调用DLL中的对话框: #include "windows.h" #include "afxwin.h" typedef CDialog* (*fnCreateDialog)(); void CallDllDialog() { HMODULE hDll = LoadLibrary(_T("mydll.dll")); if (hDll != NULL) { fnCreateDialog pfnCreateDialog = (fnCreateDialog)GetProcAddress(hDll, "CreateDialog"); if (pfnCreateDialog != NULL) { CDialog* pDlg = (*pfnCreateDialog)(); if (pDlg != NULL) { pDlg->DoModal(); delete pDlg; } } FreeLibrary(hDll); } } 此代码首先使用LoadLibrary函数加载DLL文件,然后使用GetProcAddress函数获取CreateDialog函数的指针。如果成功获取到函数指针,则可以使用该函数创建CDllDialog对象,并调用DoModal函数显示对话框。 总之,调用DLL中的对话框需要在DLL创建对话框类并导出,然后在MFC中使用LoadLibrary函数和GetProcAddress函数获取函数指针,并创建对话框对象进行操作。 ### 回答3: 在MFC中可以使用LoadLibrary函数来加载DLL,并且使用GetProcAddress函数来获取DLL中的函数地址,然后调用DLL中的函数实现对话框的调用。 以下是实现步骤: 1. 定义DLL的头文件 首先需要在MFC工程中定义DLL的头文件,包含DLL中的函数声明和结构体定义等内容。 2. 加载DLL 在需要使用DLL中函数的地方调用LoadLibrary函数来加载DLL,并保存句柄。 HINSTANCE hDll = LoadLibrary(L"MyDialog.dll"); 3. 获取函数地址 使用GetProcAddress函数获取DLL中需要调用的函数的地址。在DLL中,对话框的导出函数名为“ShowMyDialog”,因此可以使用以下代码获取该函数的地址。 typedef void (*PFDialogFunc)(); PFDialogFunc pFunc = (PFDialogFunc)GetProcAddress(hDll, "ShowMyDialog"); 4. 调用函数 获取到函数地址以后就可以通过函数指针来调用该函数,并显示对话框。 if (pFunc != NULL) { (*pFunc)(); } 在DLL中定义的导出函数需要以“__declspec(dllexport)”修饰符进行修饰,例如: __declspec(dllexport) void ShowMyDialog() { CMyDialog dlg; dlg.DoModal(); } 需要注意的是,如果DLL中的对话框涉及到资源(如图片等),需要将资源文件一并打包到DLL中。另外,DLL的编译选项也需要与主工程保持一致。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值