020-88888888

网站建设 APP开发 小程序

KNOWLEDGE/知识

分享你我感悟

您当前位置> 主页 > 知识

MFC创建与调用DLL全流程,含给MFC dll添加消息等操作

发表时间:2026-01-12 00:21:50

文章作者:小编

浏览次数:

在MFC项目里,将动态链接库进行集成以及加以使用之际,那些开发者常常会碰到配置繁杂以及调用不成功的状况,搞明白每一个步骤的具体操作以及其背后的缘由是极其关键的。

创建MFC动态链接库

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

起初开启Visual Studio,新创建一个项目。于项目类型当中挑选MFC,随后选取MFC DLL项目模板。在应用程序向导内,选择创建规则DLL的选项。紧接着在接下来这一步,定然要选择“使用MFC的静态链接”此项。最终轻点完成按钮,项目的基本框架便自动生成了。

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

创建完毕之后,系统将会造就几个关键的文件,举例来说,MyDll.cpp以及MyDll.def文件会被创立出来,项目属性里的配置默认是处于Debug模式,目标平台一般是Win32,这些初始设置得以构成开发DLL的基础环境,为后续去编写导出的函数做好了相应的准备。

编写与导出DLL函数

接下来,在名叫MyDll.cpp的文件里,去达成具体的具备功能的函数。比如说,撰写那么一个被称作Add的属于加法的函数,它会去接收两个属于整数的参数,并且返回它们两者相加之后的和。函数的主体部分内部,仅仅是很简单的相加这一操作,并不涉及到复杂的业务方面的逻辑。

达成实现之后,要于头文件MyDll.h里针对函数开展声明。声明之际必定得添加上“__declspec(dllexport)”前缀,此乃告知编译器该函数需被导出。接着运用extern "C"去确保函数名于编译之后不会被更改,以便其他程序能够正确调用。

生成DLL文件

当代码编写完成之后,去点击Visual Studio菜单栏里的“生成”这个选项,于下拉菜单项中择取“生成解决方案”这一命令,此时编译器便会着手编译整个项目,要是不存在语法错误的话,那么这个过程就能够按照顺利的进行执行。

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

编译成功之后,于项目的输出目录里会生成若干个文件,一般而言在Debug文件夹当中,能够找到MyDll.dll动态库文件以及MyDll.lib导入库文件,.dll文件涵盖了实际的函数代码,然而.lib文件会在链接阶段被调用方程序所运用。

在应用程序中配置DLL调用

新建一个作为测试工程的MFC对话框应用程序,把生成的MyDll.h头文件复制到新工程的源代码目录下方,在需要调用DLL函数的.cpp文件开头,运用#include指令包含这个头文件。

接着借助解决方案资源管理器,用鼠标右键点击项目名称,从中选择“添加”菜单里的“现有项”,寻觅并添加MyDll.lib文件,与此同时要把MyDll.dll文件拷贝到最终可执行程序.exe所处在的目录里,一般是Debug或者Release文件夹。

链接器设置与动态调用

打开项目的属性页面,于左侧列表里找寻“链接器”选项,点击其下面的“输入”设置项,在右侧的“附加依赖项”一栏当中填入MyDll.lib的文件名,要是.lib文件不在默认搜索路径,还得在“常规”那边设置附加库目录。

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

还有一种办法为运用 LoadLibrary 与 GetProcAddress 函数来实施动态加载。于代码里头调用 LoadLibrary 去加载 MyDll.dll ,接着借助 GetProcAddress 依据函数名获取函数的地址。此种办法无需在链接时设置.lib 文件,然而调用的方式相对来讲较为复杂。

调试与常见问题解决

在程序运行之际,要是出现致使找不到.dll文件的那种错误情况,首先得去查看.dll是不是处于正确的目录之中。Windows系统搜寻.dll的路径顺序是这样:先是应用程序目录,接着是系统目录,然后是由环境变量PATH指定的目录。务必保证.dll放置于应用程序所在的那个文件夹里。

要是碰到链接错误,那就去核查头文件里的函数声明跟.lib是不是相匹配,运用depends工具能够查看.dll切实导出是哪些函数,此外要保证调用方以及被调用方运用相同的字符集设置,像是都采用Unicode或者多字节字符集,以此来防止运行时崩溃。

是什么问题,是你在集成第三方DLL之际难于解决还最为棘手的呢?欢迎于评论区去分享你的经验,倘使觉得此篇文章存有帮助,请点赞予以支持。

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

相关案例查看更多