[分享]MFC扩展dll通用资源切换方法。

时间:2023-01-23 05:04:50
今天花了点时间研究了一下AutoCAD的ARX二次开发包的资源切换方法,发现蛮方便的。因此,本人仿照其实现机制,写了一个比较通用的,简单的 MFC扩展Dll资源切换的类,希望能对大家有用。

主要的头文件如下:


// "MyExtentionModule.h"
// CMyModuleResourceOverride构造、析构函数自动完成资源的切换。
// 其中,CMyModuleResourceOverride类的静态成员变量m_theExtensionModule
// 引用了全局的AFX_EXTENSION_MODULE,因此不需要显式的指明要切换到哪个资源
// 该静态成员变量应该在全局的AFX_EXTENSION_MODULE对象被定义之后完成定义。
// 可以将该头文件放在"stdafx.h"头文件中,避免一次次写#include "MyExtensionModule.h"

#pragma once

class CMyModuleResourceOverride
{
public:
CMyModuleResourceOverride();
~CMyModuleResourceOverride();

private:
HINSTANCE m_hInstanceOld;

private:
static AFX_EXTENSION_MODULE& m_theExtensionModule;
};

CMyModuleResourceOverride::CMyModuleResourceOverride()
: m_hInstanceOld(::AfxGetResourceHandle())
{
::AfxSetResourceHandle(m_theExtensionModule.hModule);
}

CMyModuleResourceOverride::~CMyModuleResourceOverride()
{
::AfxSetResourceHandle(m_hInstanceOld);
}

#define IMPLEMENT_MODULE_RESOURCE_OVERRIDE(module)\
AFX_EXTENSION_MODULE& CMyModuleResourceOverride::m_theExtensionModule = module;



另外,还需要在定义AFX_EXTENSION_MODULE全局对象的cpp中实现静态成员变量的定义,如下:

// TestModuleEx.cpp : 定义 DLL 的初始化例程。
//
#include "stdafx.h"
#include <afxdllx.h>

// 必须包含相应头文件
#include "MyExtensionModule.h"
#include "..."

// 此处省略部分由机器自动完成的代码

// 下面这句话是由机器自动生成代码。全局变量
static AFX_EXTENSION_MODULE TestModuleExDLL = { NULL, NULL };

// 通过下面这个宏,实现CMyModuleResourceOverride::m_theExtensionModule的初始化
IMPLEMENT_MODULE_RESOURCE_OVERRIDE(TestModuleExDLL);

// 此处省略部分由机器自动完成的代码

extern "C" int APIENTRY
DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{
         //此处省略DllMain的代码
return 1;   // 确定
}

// 此处省略部分由机器自动完成的代码


完成上面的工作后,在需要切换资源的地方,只需要像下面这样:

#include "MyExtensionModule.h"
void Fun()
{
CMyModuleResourceOverride myResourse;
CMyDialog() dlg;
         dlg.DoModal();
}


综上,在特定cpp文件(一般都是包含DllMain函数的cpp文件)中添加一个include和一句宏,便完成了简便资源切换的全部准备工作。
使用时,只需要定义一个自动切换对象,即实现切换。

4 个解决方案

#1


SF

#2


顶,学习

#3


学习ing

#4


不行啊!!!我试了

#1


SF

#2


顶,学习

#3


学习ing

#4


不行啊!!!我试了