(初学版)多国语言中动态加载语言dll

2023-10-26

转载请标明是引用于 http://blog.csdn.net/chenyujing1234

欢迎大家提出意见,一起讨论!

 

应用背景:

有的软件可能在不同的国家被用,那么就根据不同的国家选择不同的语言dll.(新建一个项目把资源信息编译成一个dll)。 在什么时候加载不同的dll呢?

实现方法:

从注册表中读出所用的语言类型(可以是在安装软件时用户设置的),然后验证版本相对应,如果对应那么就加载此语言dll作为项目资源句柄。

第一步:从注册表中读出语言种类.

bool GetLanguageFromRegistry(WCHAR* buffer, int SizeBytes)
{
	HKEY key;
	DWORD szType = REG_SZ;
	DWORD szSize = SizeBytes;
	bool ret = false;

	if(RegOpenKeyEx(HKEY_CURRENT_USER, L"Software\\IDS\\uEye\\uEye camera demo\\Language", 0, KEY_READ, &key) == ERROR_SUCCESS)
	{
		if(RegQueryValueEx(key, L"Language", NULL, &szType, (LPBYTE)buffer, &szSize) == ERROR_SUCCESS)
		{	
			ret = true;
		}

		RegCloseKey(key);
	}

	else
	{
		LANGID language = GetSystemDefaultLangID();	
		LANGID english = MAKELANGID(LANG_ENGLISH, SUBLANG_DEFAULT);
		LANGID german = MAKELANGID(LANG_GERMAN, SUBLANG_DEFAULT);
		
		CString Str;
		if(language == english)
			Str.LoadString(IDS_LANGUAGE_ENGLISH);
		else if(language == german)
			Str.LoadString(IDS_LANGUAGE_GERMAN);
		else
			Str.LoadString(IDS_LANGUAGE_ENGLISH);

		wcscpy(buffer, Str);
		
		if(RegCreateKeyEx(HKEY_CURRENT_USER, L"Software\\IDS\\uEye\\uEye camera demo\\Language", 0, 0, 0, KEY_ALL_ACCESS, NULL, &key, 0) == ERROR_SUCCESS)
		{
			RegSetValueEx(key, L"Language", NULL, REG_SZ, (LPBYTE)buffer, sizeof(buffer));		
			RegCloseKey(key);
			ret = true;
		}
	}

	return ret;
}


 

第二步:验证资源的dll版本号与应用程序的版本号是否对上.

bool SearchLanguageDll(WCHAR* file)
{
	bool ret = false;
	WCHAR DemoVersion[20];
	WCHAR DllVersion[20];

	GetDemoVersion(DemoVersion);
	if(GetLanguageDllVersion(file, DllVersion) == true)
	{
		if(wcscmp(DemoVersion, DllVersion) == 0)
			ret = true;
	}

	return ret;
}


 

bool GetDemoVersion(WCHAR* Result)
{
	bool ret = false;

	// Get the path to this program
	WCHAR buffer[MAX_PATH];
	GetModuleFileName(NULL, buffer, MAX_PATH);

	CString Str;
	DWORD dwSize = 0;
	DWORD dwHandle;

	dwSize = GetFileVersionInfoSize (buffer, &dwHandle);
	if(dwSize != 0)
	{
		WCHAR* pc = new WCHAR[dwSize];
		if(pc != NULL)
		{
			if(GetFileVersionInfo(buffer, 0, dwSize, pc))
			{
				VS_FIXEDFILEINFO* pfi;
				int nLen;
				if (VerQueryValue (pc, L"\\", (void**) &pfi, (PUINT) &nLen) )
				{
					swprintf(Result, L"%d.%d.%d", (pfi->dwFileVersionMS & 0xFFFF0000L)>>16,
												  (pfi->dwFileVersionMS & 0xFFFFL),
												  (pfi->dwFileVersionLS & 0xFFFF0000L)>>16);
					/*
					swprintf(Result, L"%d.%d.%d.%d",  (pfi->dwFileVersionMS & 0xFFFF0000L)>>16,
												 	 (pfi->dwFileVersionMS & 0xFFFFL),
												 	 (pfi->dwFileVersionLS & 0xFFFF0000L)>>16,
													 (pfi->dwFileVersionLS & 0xFFFFL) );
					*/

					ret = true;
				}
			}
		}

		delete[] pc;
		pc = NULL;
	}

	return ret;
}


bool GetLanguageDllVersion(const WCHAR* File, WCHAR* Result)
{
	bool ret = false;
		
	DWORD dwSize = 0;
	DWORD dwHandle;

	dwSize = GetFileVersionInfoSize ((WCHAR*)File, &dwHandle);

	if(dwSize != 0)
	{
		WCHAR* pc = new WCHAR[dwSize];
		if(pc != NULL)
		{
			if(GetFileVersionInfo((WCHAR*)File, 0, dwSize, pc))
			{
				VS_FIXEDFILEINFO* pfi;
				int nLen;
				if (VerQueryValue (pc, L"\\", (void**) &pfi, (PUINT) &nLen) )
				{
					swprintf(Result, L"%d.%d.%d", (pfi->dwFileVersionMS & 0xFFFF0000L)>>16,
											 	  (pfi->dwFileVersionMS & 0xFFFFL),
											      (pfi->dwFileVersionLS & 0xFFFF0000L)>>16);
					/*
					swprintf(Result, L"%d.%d.%d.%d",  (pfi->dwFileVersionMS & 0xFFFF0000L)>>16,
												 	  (pfi->dwFileVersionMS & 0xFFFFL),
													  (pfi->dwFileVersionLS & 0xFFFF0000L)>>16,
													  (pfi->dwFileVersionLS & 0xFFFFL) );
					*/
					ret = true;
				}
			}
		}

		delete[] pc;
		pc = NULL;
	}

	return ret;
}


第三步:加载dll作为资源句柄

HINSTANCE Lang = LoadLibrary(LanguageDll);
			if(Lang != NULL)
				AfxSetResourceHandle(Lang);

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

(初学版)多国语言中动态加载语言dll 的相关文章

  • 是否可以通过 C#.NET 编写 Win32 .dll 文件?

    是否可以通过 C NET 编写 Win32 dll 文件 如果是的话 我在哪里可以找到一些教程 如果不是 那么您对编写 Win32 DLL 有什么建议 Thanks 对的 这是可能的 事实上有一个工具可以做到这一点 它在 Rainmeter
  • 将.exe项目转换为类库

    我在 Visual Studio 2010 Ultimate 中有一个半大型 C exe 项目 我想将其转换为 DLL 类库 有没有一种简单的方法可以做到这一点 而不涉及创建新的类库项目 预先感谢 项目 gt 属性 gt 应用程序选项卡 将
  • 尝试用 C# 创建数学输入面板

    如何在 C 中创建数学输入面板 我尝试将其放入 dll 中并调用它 但它立即关闭 include
  • 在 Borland C++ Builder 6 中使用帧缓冲区对象 (FBO)

    我对帧缓冲区对象 FBO 的命令 glGenFramebuffersEXT 有 访问冲突 void TGLForm DrawScene wglMakeCurrent ghDC ghRC glEnable GL TEXTURE 2D GLui
  • json_encode 返回 NULL?

    由于某种原因 项目 描述 返回NULL使用以下代码 这是我的数据库的架构 CREATE TABLE staff id int 11 NOT NULL AUTO INCREMENT name longtext COLL
  • 在 Visual Studio C++ 2008 中包含 dll

    有没有办法将 dll 包含在项目中 这样我就不必在编译后将这些 dll 与可执行文件放在同一文件夹中 这样我就可以用它们编译我的项目 这是否有可能 如果是 有人可以指导我 我的项目是一个 opencv 项目 有很多 dll 我必须包含在文件
  • 如何读取大型平面文件

    我有一个平面文件 其中包含 339276 行文本 大小为 62 1 MB 我试图读入所有行 根据我所拥有的某些条件解析它们 然后将它们插入数据库 我最初尝试使用 bufio Scan 循环和 bufio Text 来获取该行 但缓冲区空间不
  • 何时检查未定义以及何时检查 null

    赏金编辑 我正在寻找一个很好的解释 当你应该设置 使用null or undefined以及您需要在哪里进行检查 基本上这两者的常见做法是什么 真的可以在通用的可维护代码中单独对待它们吗 我什么时候可以安全地检查 null 安全地检查 un
  • AudioRecord - 如何将数据放入缓冲区?

    我在使用 AudioRecord 类时遇到一些问题 我想将记录的数据存储在缓冲区中 但我不确定实现这一目标的正确方法是什么 我查阅了大量示例 但大多数都很复杂并且代表了许多不同的方法 我正在寻找简单的一个或简单的解释 这是我的项目的音频设置
  • Java,将 null 分配给对象和仅声明之间有什么区别

    之间有什么区别 Object o null and Object o 仅声明 有人可以回答我吗 这取决于您声明变量的范围 例如 局部变量没有default values在这种情况下你将不得不分配null手动 在这种情况下实例变量分配 nul
  • 创建简单的 c++.net 包装器。一步步

    我有一个 C 项目 我承认我在c 方面完全是零 但我仍然需要编写一个 c net 包装器 以便我可以使用它来处理非托管 c 库 所以我有什么 1 非托管项目的头文件 2 非托管项目的库 dll 和 lib 3 一个空的 C NET 项目 我
  • 结构体如何存储在内存中?

    我有一个struct iof header在我的代码中 我确定它的宽度是 24 字节 我执行 sizeof iof header 它返回 32 字节宽 问题1为什么是 32 字节宽而不是 24 字节宽 问题2包括其成员在内 结构体如何存储在
  • 将字符串作为 PChar 从 CSharp 传递到 Delphi DLL

    我正在尝试将字符串从 C 传递到 Delphi 构建的 DLL Delphi DLL 需要 PChar 这是Delphi导出 procedure DLL Message Location PChar AIntValue integer st
  • 使用 c# 中的 c++ ref 中的引用从 C# 调用 C++ 代码错误

    所以在我的 c dll 文件中我得到了以下函数 DLL void GetUserPass char userName char passWord userName ceva passWord altceva 现在我想从 c 调用它 但它给了
  • Visual Studio 2010“找不到或打开 PDB 文件”

    我尝试在 Visual Studio 10 中调试程序 但遇到断点问题 我将与 dll 文件对应的 pdb 文件放在同一目录中 但是在检查模块时 我发现每个 DLL 文件都被签名为Cannot find or open the PDB fi
  • 了解 netty 通道缓冲区和水印

    我正在尝试了解网络缓冲区和水印 作为一个测试用例 我有一个 netty 服务器 它向客户端写入数据 客户端被阻止 基本上每次读取之间有 10 秒的睡眠时间 在正常 I O 下 如果接收方被阻塞 TCP 发送方将受到限制 由于流量控制 发送速
  • 使用 Mupen64Plus 非托管 C dll API 命令填充 C# 结构

    我在用着木盆64Plus https github com mupen64plus mupen64plus core以及包含的m64p test rom v64 file 我在用着C 与mupen64plus dllAPI 是写在C Pro
  • 导入 SciPy 或 scikit-image,“from scipy.linalg import _fblas:导入错误:DLL 失败”

    我正在导入 from scipy import misc io 但我收到这些错误 Traceback most recent call last File C work asaaki code generateProposals py li
  • MySql 查询在选择中将 NULL 替换为空字符串

    如何用空字符串替换 select 中的 NULL 值 输出 NULL 值看起来不太专业 这是非常不寻常的 根据我的语法 我希望它能够工作 我希望能得到一个解释 为什么没有 select CASE prereq WHEN prereq IS
  • 链接到ntdll.lib并调用ntdll.dll内部的函数

    我最近正在对私有 API 进行一些研究 我尝试调用诸如NtOpenFile在 ntdll dll 中LoadLibrary and GetProcAddress在运行时 幸运的是 它成功了 今天早上我在电脑上进行了文件搜索 发现ntdll

随机推荐

  • tar 打包、压缩和备份

    如何理解 首先讲两个概念 打包 将一大堆文件或目录变成一个总的文件 压缩 将一个大的文件通过压缩算法变成一个小文件 这两种场景一定要区分开 网络上有的技术文章 将tar命令解释为压缩命令 是不完全正确的 关于此点 本文不再拓展 感兴趣的可以
  • 黄页是什么意思

    黄页 起源于北美洲 1880年世界上第一本黄页电话号簿在美国问世 至今已有100多年的历史 黄页是国际通用按企业性质和产品类别编排的工商电话号码薄 相当于一个城市或地区的工商企业的户口本 国际惯例用黄色纸张印制 故称黄页 目前我们常说的黄页
  • Python 类型提示和静态类型检查

    介绍 在本文中 将了解 Python 类型检查 Type Checking 在本教程中 将了解以下内容 类型注释和类型提示 将静态类型添加到代码中 包括你的代码和其他人的代码 运行静态类型检查器 在运行时强制类型 视频介绍如下 Python
  • 树莓派软键盘乱码

    树莓派软键盘乱码的快速处理 matchbox keyboard的显示 处理办法 matchbox keyboard的显示 正常的Matchbox keyboard安装完成后应该出现如下的界面 但是 在初次安装时 发现部分用户的界面出现乱码情
  • react,useEffect一直重复执行

    import useState useEffect from react useEffect callback arr useEffect接受两个参数 callback 回调函数 第一次会默认执行一次 内部可以return一个回调函数 当卸
  • 客户端和服务端端口的建立与连接

    socket 建立通信的端口 并返回引用该端口的文件描述符 man sockst https man7 org linux man pages man2 socket 2 html 头文件 include
  • nacos服务中断导致项目无法连接,就算nacos服务恢复也不会自动注册,springboot要如何配置nacos自动重连?...

    您可以在配置文件中 例如 application properties 或 application yml 中添加如下配置来启用 Nacos 自动重连 spring cloud nacos discovery retry enabled t
  • [网络安全提高篇] 一〇九.津门杯CTF的Web Write-Up万字详解(SSRF、文件上传、SQL注入、代码审计、中国蚁剑)

    这是作者网络安全自学教程系列 主要是关于安全工具和实践操作的在线笔记 特分享出来与博友们学习 希望您喜欢 一起进步 这篇文章主要介绍5月9日参加津门杯CTF题目知识 包括power cut hate php Go0SS HploadHub和
  • 一步一步写算法(之单向链表)

    声明 版权所有 欢迎转载 请勿用于商业用途 联系信箱 feixiaoxing 163 com 有的时候 处于内存中的数据并不是连续的 那么这时候 我们就需要在数据结构中添加一个属性 这个属性会记录下面一个数据的地址 有了这个地址之后 所有的
  • 四种方法让你的Boost电路更安全

    开关电源最常见的三种结构布局是降压 buck 升压 boost 和降压 升压 buck boost 这三种布局都不是相互隔离的 今天介绍的主角是boost升压电路 the boost converter 或者叫step up convert
  • 宜搭低代码开发师(高级)创建待办列表应用 流程截图及实例代码(避坑专用)

    目录 目标 操作步骤 一 主要涉及的接口 二 代码及说明步骤 目标 试题截图及步骤代码说明 很快完成考试
  • 蓝桥杯常用知识点

    datetime 库 import datetime 设置时间 start datetime date 1901 1 1 不算这一天 是从1900 12 31开始的 end datetime date 2001 1 1 到2000 12 3
  • Tesseract5.0.0+OpenCV3+VS2019安装、字符识别学习

    Tesseract5 0 0 OpenCV3 VS2019安装 字符识别学习 背景 Visual Studio 2019安装 OpenCV3安装 配置 Tesseract v5 0 0安装 在Windows PowerShell中下指令识别
  • python3+pyqt5实践历程(一)——基于socket通信与pyqt5的串口工具

    python3 pyqt5实践历程 一 基于socket通信与pyqt5的串口工具 文章目录 系列文章目录 制作背景 最终功能 工具截图展示 代码详解 系列文章目录 python3 tkinter实践历程 一 基于requests与tkin
  • 1.23 DC-DC的输入电容Cin与输出电容Cout功能

    DC DC电路的输入电容Cin和输出电容Cout是十分重要的器件 输入电容Cin和输出电容Cout具体功能如下 输入电容Cin 给DCDC电路提供稳定的输入电流 提高响应时间 且还能稳定输入电压Vin 输出电容Cout 减小DCDC电路的输
  • STM32——中断概览(中断优先级)

    中断是指计算机运行过程中 出现某些意外情况需要主机干预时 机器能够自动停止正在运行的程序并转入处理新情况的程序 处理完毕后有返回原来被暂停的程序继续运行 STM32的中断和异常 1 对于异常和外部中断的功能 对于STM32单片机而言 是由芯
  • 弹性盒子flex

    display flex flex direction属性决定主轴的方向 即项目的排列方向 flex direction row row reverse column column reverse row 默认值 主轴为水平方向 起点在左端
  • P1010 [NOIP1998 普及组] 幂次方

    NOIP1998 普及组 幂次方 题目描述 任何一个正整数都可以用 2 2 2 的幂次方表示 例如 137 27 23 2 0 同时约定方次用括号来表示 即 a b a b
  • Python iter()函数

    描述 iteration 迭代的意思 顾名思义 iter 函数用来返回迭代器对象 语法 iter object sentinel 参数介绍 object 支持迭代的集合对象 sentinel 如果传递了第二个参数 则参数object必须是一
  • (初学版)多国语言中动态加载语言dll

    转载请标明是引用于 http blog csdn net chenyujing1234 欢迎大家提出意见 一起讨论 应用背景 有的软件可能在不同的国家被用 那么就根据不同的国家选择不同的语言dll 新建一个项目把资源信息编译成一个dll 在