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") 








