當您註冊的 ATL 伺服器長名稱時,收到 「 系統找不到指定的檔案 」 錯誤訊息

文章編號: 201318 - 檢視此文章適用的產品。
全部展開 | 全部摺疊

徵狀

登錄中的 ATL 伺服器具有長檔名或其中一個存放在目錄中,以長路徑名稱傳回一個 0x80070002 錯誤:
系統找不到指定的檔案。
為 DLL,Regsvr32.exe 便會傳回這個錯誤。為 EXE 中 _tWinMain(), Module::RegisterServer (CComModule::RegisterServer) 來呼叫會傳回這個錯誤。

發生的原因

ATL 的註冊程式碼使用 GetShortPathName() 擷取檔案的短名稱,並使用註冊的簡短的名稱。 如果檔案不會有短檔案名稱,就會失敗 GetShortPathName()。預設的行為,在 Windows NT、 Windows 95 和 Windows 98 是自動建立長名稱的短檔名 (8.3 格式) 的檔案。您可以使用 「 系統原則編輯器 」 (Poledit.exe),將此選項關閉。特定檔案系統也不支援簡短名稱的建立根據預設值。ATL 嘗試使用傳回的 GetShortPathName() LoadLibraryEx(),呼叫中的無效檔案名稱,並且 0x80070002 而失敗。

解決方案

在 ATL 來源呼叫時 GetShortPathName(),加入程式碼,以檢查已成功。必須修改下列功能:
  • 線條 4933 CComModule::UpdateRegistryFromResourceS(UINT...)-ATLBASE.H。
  • 線條 4965 CComModule::UpdateRegistryFromResourceS(LPCTSTR...)-ATLBASE.H。
  • AtlModuleUpdateRegistryFromResourceD()-ATLBASE.H,線條 5896。
變更下列行從:
// Convert to short path to work around bug in Windows NT 4.0's CreateProcess.
TCHAR szModuleShort[_MAX_PATH];
GetShortPathName(szModule, szModuleShort, _MAX_PATH);
LPOLESTR pszModule = T2OLE(szModuleShort);
				
下列:
// Convert to short path to work around bug in Windows NT 4.0's CreateProcess.
TCHAR szModuleShort[_MAX_PATH];
int cbShortName = GetShortPathName(szModule, szModuleShort, _MAX_PATH);
LPOLESTR pszModule;
if (cbShortName == _MAX_PATH)
    return E_OUTOFMEMORY;
pszModule = (cbShortName == 0||cbShortName == ERROR_INVALID_PARAMETER) \  ? T2OLE(szModule) : T2OLE(szModuleShort);
				
CComModule::RegisterClassHelper (ATLBASE.H 行 5044),在變更下列行從:
// Convert to short path to work around bug in Windows NT 4.0's CreateProcess.
TCHAR szModuleShort[_MAX_PATH];
GetShortPathName(szModule, szModuleShort, _MAX_PATH);
key.SetKeyValue(szLS32, szModuleShort);
				
下列:
// Convert to short path to work around bug in Windows NT 4.0's CreateProcess.
TCHAR szModuleShort[_MAX_PATH];
int cbShortName = GetShortPathName(szModule, szModuleShort, _MAX_PATH);
if (cbShortName == _MAX_PATH)
    return E_OUTOFMEMORY;
if (cbShortName == 0 || cbShortName == ERROR_INVALID_PARAMETER)
    key.SetKeyValue(szLS32, szModule);
else
    key.SetKeyValue(szLS32, szModuleShort);
				
這些變更有沒有結果如果您建立的 ReleaseMinSize,因為 ATL.dll 的程式碼會改用。

狀況說明

Microsoft 已確認這是在 Microsoft 中的錯誤,會列在本文開頭的產品。 這個 Bug 已經在 Visual Studio 6.0 Service Pack 3 中獲得修正。
如需詳細資訊,請按一下下列的文件編號,檢視 「 Microsoft 知識庫 」 中的文件:
194295HOWTO: 告訴安裝 Visual Studio 6.0 Service Pack
如需詳細資訊,請按一下下列的文件編號,檢視 「 Microsoft 知識庫 」 中的文件:
194022資訊: Visual Studio 6.0 服務封裝什麼、 何處,為何

其他相關資訊

ATL 登錄如果要解決 Windows NT CreateProcess() 函式中的錯誤使用短檔案名稱的伺服器。

如需詳細資訊,請按一下下列的文件編號,檢視 「 Microsoft 知識庫 」 中的文件:
179690FIX: 有長檔案名稱啟動 COM 伺服器傳回 0x80080005
如需詳細資訊,請按一下下列的文件編號,檢視 「 Microsoft 知識庫 」 中的文件:
173673Windows NT 的 Windows NT Server 工具工作站 4.0 可用

?考

如需詳細資訊,請按一下下列的文件編號,檢視 「 Microsoft 知識庫 」 中的文件:
179690注意: TCProps.dll 失敗時要在安裝期間登錄

屬性

文章編號: 201318 - 上次校閱: 2005年4月28日 - 版次: 3.0
這篇文章中的資訊適用於:
  • Microsoft ActiveX Template Library 3.0?應用於:
    • Microsoft Visual C++ 6.0 Enterprise Edition
    • Microsoft Visual C++ 6.0 Professional Edition
    • Microsoft Visual C++, 32-bit Learning Edition 6.0
關鍵字:?
kbmt kbbug kbfaq kbfix kbregistry kbvs600sp3fix KB201318 KbMtzh
機器翻譯
重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。
按一下這裡查看此文章的英文版本:201318
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。

提供意見