ATL元件中文路徑註冊問題 (轉)
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++; ! @1
}
return TRUE;
}
BOOL AddChar(const TCHAR* pch)
{
if (nP== nSize) // realloc @3
{
nSize *= 2;
p = (LPTSTR) CoTaskMemRealloc(p, nSize*sizeof(TCHAR));
}
p[nPos++] = *pch;
#ifndef _UNICODE
if (IsCSLeadByte(*pch))
p[nPos++] = *(pch + 1); ! @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) 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會壞了你的好事.
修改現有的類庫是很危險的事情。因為他們的呼叫關係太複雜了.不過,如果他裡面有,這也算是一個
好方法.
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-990167/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Windows程式讀取不了中文路徑問題Windows
- C# 從登錄檔判斷指定ocx控制元件是否已註冊 以及獲取它的註冊路徑C#控制元件
- vbs指令碼獲取Am註冊路徑資訊指令碼
- 未能註冊模組(程式路徑)\ieframe.dll提示
- struts/Servlet,action轉到jsp後,路徑問題(struts2,jsp路徑,action路徑,action跳轉,相對路徑,絕對路徑)...ServletJS
- python中文註釋問題Python
- 遞迴路徑問題遞迴
- 資源路徑問題
- vue之元件註冊Vue元件
- Spring元件註冊Spring元件
- “正在註冊字型”問題解決
- 網站自動註冊問題網站
- 演算法——路徑問題演算法
- vue動態註冊元件Vue元件
- C#:註冊元件 (cmd)C#元件
- JSP、Servlet中的相對路徑和絕對路徑 頁面跳轉問題JSServlet
- 利用ATL製作程式多媒體封面元件 (轉)元件
- 使用ATL建立支援IClassFactory2的COM元件 (轉)元件
- Oracle10g中的靜態註冊及動態註冊問題Oracle
- 檔案路徑問題( ./ 和 ../ 和 @/ )
- ModelAndView導包路徑問題View
- dataguard歸檔路徑的問題
- Vue元件之全域性註冊Vue元件
- 元件註冊與畫布渲染元件
- 【Spring註解開發】元件註冊-使用@Configuration和@Bean給容器中註冊元件Spring元件Bean
- web專案絕對路徑與相對路徑的問題Web
- WIN2K下COM元件的反註冊方法。 (轉)元件
- 帝國cms無法註冊登入快速解決方法附路徑
- django建立的專案路徑問題Django
- laravel上傳圖片路徑問題Laravel
- 課時23.路徑問題(理解)
- web應用中的路徑問題Web
- 解決pdf.js路徑問題JS
- DWR中引用JS的路徑問題JS
- attachEvent()註冊事件處理函式this指向問題事件函式
- banq,關於你那註冊程式的問題
- getParameter方法的中文問題【轉】
- Java中文問題詳解(轉)Java