看流星社区

 找回密码
 注册账号
查看: 1796|回复: 0

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

[复制链接]

该用户从未签到

发表于 2013-5-19 10:31:16 | 显示全部楼层 |阅读模式
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的代码出了问题。
点击按钮快速添加回复内容: 支持 高兴 激动 给力 加油 苦寻 生气 回帖 路过 感恩
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

小黑屋|手机版|Archiver|看流星社区 |网站地图

GMT+8, 2024-5-15 21:13

Powered by Kanliuxing X3.4

© 2010-2019 kanliuxing.com

快速回复 返回顶部 返回列表