首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

ATL控件在中文名文件夹下注册不上?解决思路

2012-01-23 
ATL控件在中文名文件夹下注册不上?ATL写的控件,编译时选择ReleaseMinDependency生成DLL,但在是中文名的文

ATL控件在中文名文件夹下注册不上?
ATL写的控件,编译时选择ReleaseMinDependency生成DLL,但在是中文名
的文件夹下注册不上?
如:c:\Program   Files\下载\       这个目录下就注册不上。
在注册表中就会显示一段乱码,加载出错。让regsvr32   注册时提示成功。

怎么解决呢?

[解决办法]
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的代码出了问题。

热点排行