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

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

解决方案:修改STAREG.H文件,修改196行开始的AddChar 和 AddString函数,修改后的代码如下:

     BOOL AddChar(const TCHAR* pch)
        {
            //if (nPos == nSize) // realloc
            //fix register bug with chinese path
            if (nPos == nSize - 1 )
            {
                nSize *= 2;
                p = (LPTSTR) CoTaskMemRealloc(p, nSize*sizeof(TCHAR));
            }
            p[nPos++] = *pch;
#ifndef _UNICODE
            if (IsDBCSLeadByte(*pch))
                p[nPos++] = *(pch + 1);
#endif
            return TRUE;
        }
        BOOL AddString(LPCOLESTR lpsz)
        {
            USES_CONVERSION;
            LPCTSTR lpszT = OLE2CT(lpsz);
            while (*lpszT)
            {
                AddChar(lpszT);
#ifndef _UNICODE
                //fix bug with chinese path
                if (IsDBCSLeadByte(*lpszT))
                    lpszT++;
#endif
                lpszT++;
            }
            return TRUE;
        }

编译时必须使用_ATL_STATIC_REGISTRY,即静态链接ATL代码,而不使用ATL.dll,否则无效,因为正是ATL.dll的代码出了问题。

—————————————————————————————————

本文原创自Sliencecsdn技术博客。

本博客所有原创文章请以链接形式注明出处。

欢迎关注本技术博客,本博客的文章会不定期更新。


大多数人想要改造这个世界,但却罕有人想改造自己。

世上没有绝望的处境,只有对处境绝望的人。

                                              ————By slience

—————————————————————————————————


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值