• 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函数获得。

  • 相关阅读:
    hdu 2147 kiki's game
    HDU 1846 Brave Game
    NYOJ 239 月老的难题
    NYOJ 170 网络的可靠性
    NYOJ 120 校园网络
    xtu字符串 B. Power Strings
    xtu字符串 A. Babelfish
    图论trainning-part-1 D. Going in Cycle!!
    XTU 二分图和网络流 练习题 J. Drainage Ditches
    XTU 二分图和网络流 练习题 B. Uncle Tom's Inherited Land*
  • 原文地址:https://www.cnblogs.com/ezhong/p/2171454.html
Copyright © 2020-2023  润新知