DLL中使用资源的笔记

内容是读这个博客的笔记,基本一样,但不记不踏实。作者写的很详细。

http://blog.csdn.net/rivershan/article/details/15789

分MFC DLL 和Win32 DLL 

(一)

在Win32 DLL 中使用资源很简单,直接用。

DLL中:

extern "C" __declspec(dllexport) void ShowDlg()

{}

使用DLL:

extern “C” __declspec(dllexport )void ShowDlg();

#pragma comment(lib,"debug/UseDlg")

(二)

MFC DLL  : 

 1. 静态链接到MFC       Regular DLL using shared MFC DLL

DLL中:在 EXPORTS 语句加一行 ShowDlg

使用DLL:void ShowDlg(); 

      #pargma comment(lib,"debug/DLLStatic")

  2. 动态链接到MFC      Regular DLL with MFC statically linked

使用时需要注意模块状态。

否则会调用到  主应用程序的资源。

用到函数和宏:

AFX_MODULE_STATIC * AFXAPI AfxGetStaticModuleStatic();

在堆栈构造AFX_MODULE_STATIC类实例,构造函数获取当前模块状态的指针并保存在成员中,

将pModuleStatic设置为新的有效模块状态。

析构函数将存储在成员中的前一个模块状态还原到当前模块。

AFX_MANAGE_STATE(AFX_MODULE_STATE * pModuleState)

将pModuleState设置为当前的 即时作用空间 中的有效状态模块,在离开该宏的作用空间时,自动还原到

上一个有效状态模块。

HINSTANCE AfxGetResourceHandle()

函数返回了一个保存了HINSTANCE类型的。应用程序默认所加载资源的模块的句柄。

void AfxSetResourceHandle(HINSTANCE  hInstResource)

函数将hInstResource 所代表的模块设置为具有当前状态的模块。

使用方法1: 自动切换。

在 Regular DLL using shared MFC DLL工程中。

在ShowDlg 函数的第一条语句前加

AFX_MANAGE_STATIC(AfxGetStaticModuleState());确保是函数的第一句。

使用方法2:手动切换

函数最开始加 

HINSTANCE save_hInstance = AfxGetResourceHandle();

AfxSetResourceHandle(theApp.m_hInstance);将DLL模块设置为当前状态。

(也可以调用GetModuleHandle函数获得DLL模块的句柄)

在调用对话框(资源)成功之后,也就是例子的dlg.DoModal()之后,

AfxSetResourceHandle(save_hInstance);

手动的好处:在完成使用资源的任务之后就可以立即恢复资源句柄。

而AFX_MANAGE_STATE(AfxGetStaticModuleState())方法只能等函数的作用空间结束之后才能恢复资源句柄。

由于可执行文件必须调用资源等原因,建议只要有可能就必须恢复资源句柄,否则可能会遇到许多问题。

比如,用户移动了主应用程序的对话框,而此时资源句柄仍然是DLL的资源句柄,程序就会崩溃。

最后的恢复方法就是在对话框响应WM_INITDIALOG消息的时候,因为这时候对话框的模板已经读出了。

 3. 动态链接到MFC   MFC extension DLL(using shared MFC DLL)

切换当前模块的方法与Regular DLL using shared MFC DLL的相似,不同如下:

使用 AFX_MANAGE_STATE(AfxGetStaticModuleState())产生如下错误:

mfcs42d.lib(dllmodul.obj) : error LNK2005: __pRawDllMain already defined in dllextend.obj

mfcs42d.lib(dllmodul.obj) : error LNK2005: _DllMain@12 already defined in dllextend.obj

mfcs42d.lib(dllmodul.obj) : error LNK2005: __pRawDllMain already defined in dllextend.obj

要将AFX_MANAGE_STATE(AfxGetStaticModuleState())换成

AFX_MANAGE_STATIC(AfxGetAppModuleState())

手动方法一样。

并且 DLL模块的句柄可以通过MFC提供的DlgextentDLL结构的 hModule成员获取:

 用法:AfxSetResourceHandle(DlgextentDLL.hModule);

对于动态链接到MFC的DLL,在调用该DLL的MFC应用程序中可以使用

AfxGetResourceHandle 和AfxSetResourceHandle函数切换当前模块状态,DLL模块的句柄可以通过

GetModuleHandle函数获得。

原文地址:https://www.cnblogs.com/ezhong/p/2171454.html