网上找了几个例子,说的都不够清晰,干脆自己动手写一个,整理出来留给后来人借阅
首先文件->新建->项目,选中mfc->mfc dll,名字zydll,直接点击完成,创建一个(在共享DLL中使用mfc)的dll
起初我选择在静态库中使用,频繁提示错误,干脆修改成共享dll,问题解决。我们继续
切换到资源标签,添加资源->string table 点击新建,修改标题为test,修改值为2000
接着右键->添加资源->导入->图片资源
这里重头戏即将开始
工程上右键->属性->连接器->无入口点选择(是/NOENTRY)
修改随机基址为:禁止映像随机化(/DYNAMICBASE:NO)
修改数据执行保护(DEP)为默认值
点击确定,现在就可以编译dll了
1>------ 已启动全部重新生成: 项目: zydll, 配置: Debug Win32 ------
1>正在删除项目“zydll”(配置“Debug|Win32”)的中间文件和输出文件
1>正在编译...
1>stdafx.cpp
1>正在编译...
1>zydll.cpp
1>正在编译资源...
1>Microsoft (R) Windows (R) Resource Compiler Version 6.1.6723.1
1>Copyright (C) Microsoft Corporation. All rights reserved.
1>正在编译资源清单...
1>Microsoft (R) Windows (R) Resource Compiler Version 6.1.6723.1
1>Copyright (C) Microsoft Corporation. All rights reserved.
1>正在链接...
1> 正在创建库 C:\VC\VS9\zydll\Debug\zydll.lib 和对象 C:\VC\VS9\zydll\Debug\zydll.exp
1>atlsd.lib(Externs.obj) : warning LNK4210: 存在 .CRT 节;可能有未处理的静态初始值设定项或结束符
1>mfcs90ud.lib(dllmodul.obj) : warning LNK4210: 存在 .CRT 节;可能有未处理的静态初始值设定项或结束符
1>atlsd.lib(atltrace.obj) : warning LNK4210: 存在 .CRT 节;可能有未处理的静态初始值设定项或结束符
1>zydll.obj : warning LNK4210: 存在 .CRT 节;可能有未处理的静态初始值设定项或结束符
1>stdafx.obj : warning LNK4210: 存在 .CRT 节;可能有未处理的静态初始值设定项或结束符
1>mfcs90ud.lib(nolib.obj) : warning LNK4210: 存在 .CRT 节;可能有未处理的静态初始值设定项或结束符
1>mfcs90ud.lib(dllmodul.obj) : warning LNK4210: 存在 .CRT 节;可能有未处理的静态初始值设定项或结束符
1>mfcs90ud.lib(stdafx.obj) : warning LNK4210: 存在 .CRT 节;可能有未处理的静态初始值设定项或结束符
1>正在嵌入清单...
1>Microsoft (R) Windows (R) Resource Compiler Version 6.1.6723.1
1>Copyright (C) Microsoft Corporation. All rights reserved.
1>生成日志保存在“file://c:\VC\VS9\zydll\Debug\BuildLog.htm”
1>zydll - 0 个错误,8 个警告
========== 全部重新生成: 成功 1 个,失败 0 个,跳过 0 个 ==========
会出现一坨警告,不用理会它们
调用资源dll方法
新建一个disable工程,工程名为testdll
在对话框上添加一个Picture Control控件,修改ID号为IDC_TESTZYDLL
并修改type为Bitmap
在Oninitdialog函数中编写代码
HMODULE hModule = LoadLibrary("zydll.dll");
if (hModule == NULL)
{
MessageBox("加载资源文件失败!");
return true;
}
char buffer[255];
memset(buffer,0,sizeof(buffer));
LoadString(hModule,2000,buffer,sizeof(buffer));
HBITMAP hBitmap = LoadBitmap(hModule,MAKEINTRESOURCE(2001));
if (hBitmap == NULL)
{
MessageBox("加载图片资源失败!");
return true;
}
((CStatic*)GetDlgItem(IDC_TESTZYDLL))->SetBitmap(hBitmap);
FreeLibrary(hModule);
编译执行,图片就被加载成功鸟~~