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

01. C/C++ 专栏收录该内容
87 篇文章 1 订阅
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
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

参与评论 您还未登录,请先 登录 后发表或查看评论
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页

打赏作者

Silence-轩辕-寂

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值