最近在写接口程序,要使用到动态链接库。使用中遇到一些问题,现总结如下:
动态链接库创建,本程序是一个带窗体的MFC的动态链接库,使用.def方式导出,方便后期使用:动态链接库 静态调用的方式使用。
1,新建动态链接库项目,项目属性:
注意其中的:配置类型,mfc的使用
2,新建窗体
在资源视图中添加窗体资源,
3,添加窗体类
在资源视图,窗体界面 右键 添加类,
同时完善窗体设计,添加代码
void cDialog::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
AfxMessageBox(_T("调用成功"));
}
4,修改主项目代码,:注意,不是窗体类代码
4.1,头文件修改(*.h),引入资源文件
#include "resource.h" // 主符号
4.2修改源文件(*.cpp,如MFCdll.cpp)
//引入窗体
# include "cDialog.h"
//定义输出库函数,以被MFC程序调用
//extern "C" __declspec(dllexport) void ShowDlg(void)
extern "C" void _stdcall ShowDlg(void) //def 模式,推荐使用
{
//必须:添加AFX_MANAGE_STATE宏,进行DLL模块状态资源的切换
AFX_MANAGE_STATE(AfxGetStaticModuleState());
//创建DLL对话框
cDialog dllDialog;
dllDialog.DoModal();
}
4.3修改 *.def文件
; MFCdll.def : 声明 DLL 的模块参数。如果要将函数确定不能使用动态调用,需要在函数名称后加 private 修饰(private修饰的作用是:禁止将 entryname 包含在由 LINK 生成的导入库中。这就决定了导出函数只能进行动态调用,因为它没有被编译进导出库文件中)。如:ShowDlg private
LIBRARY
EXPORTS
; 此处可以是显式导出
ShowDlg
编译完成!!(因为不是可执行程序,编译结束会报错)