ATL组件中文路径注册问题

5分钟搞定ICESat-2数据下载:从注册EarthData账号到批量获取ATL07数据 本文提供了一份极简高效的ICESat-2数据下载实战指南,重点介绍如何快速注册EarthData账号并批量获取ATL07数据。文章详细解析了从账号准备、NSIDC官网精准导航、数据筛选与“购物车”下单,到使用Wget等命令行工具实现稳定、断点续传批量下载的全流程,旨在帮助极地与海冰研究者避开常见陷阱,快速获取所需科研数据。 阅读详情

ATL组件中文路径注册问题

  我曾用ATL写过一个COM组件(MBCS下编译),如果安装在中文路径下的话,注册就会失败.
  为什么会失败?
  打开ATL的源文件statreg.h,可以找到函数BOOL AddString(LPCOLESTR lpsz),他被
组件的UpdateRegistry所调用,他又调用了BOOL AddChar(const TCHAR* pch).问题就
出现在这两个函数中。请看:
  BOOL AddString(LPCOLESTR lpsz)
  {
   USES_CONVERSION;
   LPCTSTR lpszT = OLE2CT(lpsz);
   while (*lpszT)
   {
    AddChar(lpszT);
    lpszT++; // note! @1
   }
   return TRUE;
  }
  BOOL AddChar(const TCHAR* pch)
  {
   if (nPos == nSize) // realloc @3
   {
    nSize *= 2;
    p = (LPTSTR) CoTaskMemRealloc(p, nSize*sizeof(TCHAR));
   }
   p[nPos++] = *pch;
#ifndef _UNICODE
   if (IsDBCSLeadByte(*pch))
    p[nPos++] = *(pch + 1); file://note! @2
#endif
   return TRUE;
  }
 当我们不是使用UNICODE时,如果遇到一个汉字的话,标注@2行识别整个汉字,存入缓冲区.但是pch变量仍然指向
汉字的第一个字节,返回到@1行时,lpszT++后指向了该汉字的第二个字节!以后又把该汉字的第二字节当成一个独立的字
符再次处理一遍.所以就产生了乱码.(致使组件注册的信息有一部分是错误的)
 怎么解决?
 由上面的分析,很容易得到解决的办法:
  BOOL AddString(LPCOLESTR lpsz)
  {
   USES_CONVERSION;
   LPCTSTR lpszT = OLE2CT(lpsz);
   while (*lpszT)
   {
    AddChar(lpszT);
    lpszT++; 
   }
   return TRUE;
  }
/*******************************************************************
 * This function cause some error in hanzi.
 *  Modified by L.C. ,Nov 12th,2001
 *******************************************************************/
/********************************************************************
  BOOL AddChar(const TCHAR* pch)
 ********************************************************************/
  BOOL AddChar(const TCHAR* &pch) file://we'll modify the pch value
  {
   if (nPos == nSize) // realloc
   {
    nSize *= 2;
    p = (LPTSTR) CoTaskMemRealloc(p, nSize*sizeof(TCHAR));
   }
   p[nPos++] = *pch;
#ifndef _UNICODE
   if (IsDBCSLeadByte(*pch))
/*******************************************************************
    p[nPos++] = *(pch + 1); 
********************************************************************/
    p[nPos++] = *( ++ pch);
#endif
   return TRUE;
  }
 还有什么错误?
 请观察@3行,如果阅读一下这个类的源代码(180行开始),很明显会有缓冲区溢出的危险:
在非UNICODE情况下,nPos要加两次,而进入这段代码时有可能是nPos=nSize-1.如果是这样,恐怕程序的
会有一些无法预测的行为(虽然几率很小:在 rgs文件中出现大段中文的可能性不多)。修改实际上比较
容易,将if (nPos == nSize) 变为if (nPos == nSize-1)即可。(当然有很多别的方法)
 结论
 如果你的组件有可能出现在中文路径下的话(使用MBCS),建议你在编译时使用_ATL_STATIC_REGISTRY
编译,并且在编译前修改ATL中相关的代码(或自己写注册函数)。否则现有的ATL.DLL会坏了你的好事.
 修改现有的类库是很危险的事情。因为他们的调用关系太复杂了.不过,如果他里面有BUG,这也算是一个
好方法.
 

通过ATL库CRegKey读、写、遍历注册表(简单方便) CRegKey读、写、遍历注册表 阅读详情

相关推荐

Visual C++ 2010 Express 中文版编程入门与实战

Visual C++ 2010 Express 是微软推出的免费集成开发环境,专为C++初学者和独立开发者量身打造,支持Windows平台原生应用程序的快速开发。该版本虽功能较商业版Visual Studio有所精简,但保留了核心编译器、调试器和MFC/ATL框架支持,具备良好的代码编辑与项目管理能力。其安装轻便、界面简洁,并针对中文用户提供了本地化语言包支持,极大降低了学习门槛。广泛应用于高校教学、小型项目原型开发及C++语言特性实践,是入门Windows系统编程的理想选择。

weixin_28872035的博客 1086

ATL组件中文路径注册问题辨析

ATL组件中文路径注册问题辨析(转载请注明来源于金庆的专栏)ATL开发一个COM组件,Release MinDependency配置项构建的DLL注册后无法创建对象。原因是DLL注册的路径上有中文。而Debug及Release MinSize编译结果是正常的,或将DLL注册在英文路径上也是好的。查阅网上的相关文章,可以修改StatReg.h,并定义_ATL_STATIC_REGISTRY来解决。1

金庆的专栏 2816

S-function入门及案例详解(3)——S-function进阶案例

目录1.案例描述2.案例详解3.输出波形4.对输入参数进行Mask打包 1.案例描述 设计一个蹦极系统 h为离地面高度,输入参数为长度、质量、离地面高度。 2.案例详解 步骤1.可以修改sfuntmpl函数的名称(这里修改为bengji),并在括号内增加输入参数 参数len,weight,dist分别表示长度、质量、离地面高度;长度用来初始化x0,质量用来初始化m,离地面高度用来初始化h。 function [sys,x0,str,ts,simStateCompliance] = bengji(t,x,u

Wendy的博客 1万+

ATL组件中文路径注册问题 (转)

ATL组件中文路径注册问题 (转)[@more@]ATL组件中文路径注册问题 我曾用ATL写过一个COM组件(MBCS下编译),如果安装在中文路径下的话,注册就会失败. 为什么会失败? 打开ATL的源文件statreg...

cuiji1279的博客 153

树莓派5使用CSI摄像头 | 树莓派5接上CSI摄像头后命令行操作显示检测无设备

此系列用于记录树莓派5的一些操作,这篇文章讲述树莓派5如何使用CSI摄像头。

beyourself_he的博客 8796

1.全基因组重测序数据分析介绍

二代测序原理及fastq数据解读、全基因组重测序数据分析内容

weixin_53682198的博客 1885

ATL 实现定制的 IE 浏览器栏、工具栏和桌面工具栏

ATL 实现定制的 IE 浏览器栏、工具栏和桌面工具栏作者:杨老师下载源代码关键字:Band,Desk Band,Explorer Band,Tool Band,浏览器栏,工具栏,桌面工具栏一、引言  最近,由于工作的要求,我需要在 IE 上做一些开发工作。于是在 MSDN 上翻阅了一些资料,根据 MSDN 上的说明我用 ATL 胜利完成了“资本家老板”分配的任务。(并且在白天睡觉的过程中梦到

杨德龙的专栏 1694

NX二次开发获取最小包容块和最小包容柱(PK)

用PK获取最小包容块的数据,拿到方向后再用PK求极限点,将点的数据转换到同一平面,最后求多个点的外接圆就出来了。

qq_39541524的博客 3121

如何让com组件能注册到中文目录下

我做的com组件(STA和MTA的都有),ActiveX都不能注册到中文目录下,在英文目录下没有任何问题,可以很正常的使用,但是如果注册到中文目录下就说找不到组件,使用Oleview查看时发现注册路径是乱码,Oleview也说找不到组件     原因是 Release   MiniDependency版本的中文路径问题   解决方法为:  修改 vc/atl 中的 StatReg.h    

jonfei的专栏 903

excel 如何自动调整行间距 vba

EXCEL是一个非常使用的软件,虽然我们平时仅使用他做一些报表,仅此而已;我在工作中,由于很懒,不愿意做考试重复的工作,就想着使用vba的宏来完成重复的工作,这样就能省出一部分的时间来了。本人不喜欢在博客里面写以下教程类的东西,我的理念是将工作中的痛点的解决办法分享出来,以解决问题为主。

sixtome 1316

机器学习实战1-四种算法对比对客户信用卡还款情况进行预测与模型评估

大家好,我是微学AI,今天给大家带来一个机器学习实战案例:利用机器学习的四种算法对比对客户信用卡还款情况进行分类。信用卡又叫贷记卡,是由商业银行或信用卡公司对信用合格的消费者发行的信用证明。现在的年轻人,特别是80后,90后甚至00后到喜欢超前消费,每个人名下多多少少都有至少一张信用卡,有些人由于过度超前消费,导致下个月无法还款导致的逾期,这样会对个人征信产生影响,今天我们就来分析分析具有哪些特性的人会有信用卡逾期的可能。

微学AI的博客 4710

ATL3.0组件注册bug的解决方法

ATL3.0编写的组件在注册时,如果组件所在目录包含中文路径,不能在注册表生产正确的路径,从而产生虽然注册成功,却不能使用的问题,因为在注册表记录的DLL路径中文部分有乱码。这个问题很久以前就发现,一直没有解决。前段时间在网上搜索到解决方案,并转载在blog上,却一直没有实际试用。今天企图使用,却发现不成功,昏倒,试了几次都不行。看来网上的代码还是不能轻信。不知道文章的作者有没有实际调试成功,不过

Silence的程序实验室 2340

部署与可视化系统:移动端落地保姆级教程:YOLOv8 转换为 NCNN 并封装进 Android App 调用摄像头实时检测

本文介绍了在移动端部署YOLOv8模型的最佳实践。通过实测数据对比,采用NCNN框架在骁龙865设备上可实现35+FPS的实时推理性能。文章详细分析了NCNN相比TFLite、MNN等框架的优势,包括更高的ARM CPU性能、更优的Vulkan GPU加速和更小的模型体积。同时提供了从PyTorch模型到NCNN格式的完整转换流程,包括FP16优化和INT8量化方法,并重点解析了YOLOv8特有的输出格式处理要点。建议开发者先在Python环境验证NCNN推理流程,再部署到Android平台,以确保最佳性能

ZXSXJ的博客 210

ATL组件注册表中显示乱码的问题

在非中文系统中注册ATL组件,当组件路径中包含中文时,注册表中的路径可能显示乱码,导致ATL组件无法使用。 这是由ATL程序的bug所导致的,解决方案是在程序设定中去掉[_ATL_STATIC_REGISTRY]定义。

largewolf的专栏 551

【docker】第10篇 Failed with result ‘exit-code和Start request repeated too quickly和Failed to start Docker

【docker】解决 Failed with result 'exit-code'和Start request repeated too quickly和Failed to start Docker。

Fanjufei的博客 6822

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

COM组件与编译的字符集类型

用VC6.0 ATL编译一个多字节字符集的组件,在有中文路径下进行注册,发现注册表中的文件路径的中文变成了乱码(XP、Vista、Windows7下都是)。字符集类型设置为UNICODE,编译出来的组件没有这个问题。 VC2003编译的多字节字符集的组件则可以在中文路径下正确被注册。但是好像需要管理员权限。 为什么呢?实际情况总是比理论复杂!

zhihuizhilv的专栏 693

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

使用ATL设计组件(VC6.0)

使用ATL设计组件(VC6.0) fangyukuan 2007年11月30日 ATL(ActiveX Tempelate Library)使用基于模板的方法充分地对COM进行了支持。通过对ATL所提供的模板的继承,可以直接获得IUnknown、IDispatch、ICla

http://www.softwareace.cn 王牌软件 636

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

ATL Win32 Release MiniDependency。想说爱你,不容易啊!

今天遇到这种情况,不知道大家遇到过没有。现象:在VC中编译,注册,都成功的。而且在OLE/COM object viewer上查看也是正确的,一切都和Debug时候的配置是一样的。但是这样注册以后,以前许多能够在Debug ATL环境下运行的代码,现在都罢工了。而且很纳闷,就是把工程换了一个方式编译了一下,怎么就会出现那么多问题呢。解决:后来无意中,把这个控件放到一个全英文的目录下,注册,

hanyannan0123的专栏 701

ATL项目开发遇到的各种问题

Dll注册问题 管理员权限运行cmd cd 切换到 dll 所在路径 注意dll所在路径不能有中文,不然会提示找不到 注册命令 regsvr32 xxx.dll 引用组件的项目设置 开发环境:win10,ide: vs2020 使用上面的注册,可能默认就不是注册32位,所以不能勾选32。 如果勾选“首选32”那么就会报错 检索 COM 类工厂中 CLSID 为 {629C0256-908A-4296-8C64-E81F5BDEA106} 的组件失败,原因是出现以下错误: 80040154 没有注册

云端上的蚂蚁 977
Explorer
博客等级 码龄27年 0粉丝 1原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值