Recibe un mensaje de error "el sistema no puede encontrar el archivo especificado" al registrar un servidor ATL con un nombre largo

IMPORTANTE: Este artículo ha sido traducido por un software de traducción automática de Microsoft (http://support.microsoft.com/gp/mtdetails) en lugar de un traductor humano. Microsoft le ofrece artículos traducidos por un traductor humano y artículos traducidos automáticamente para que tenga acceso en su propio idioma a todos los artículos de nuestra base de conocimientos (Knowledge Base). Sin embargo, los artículos traducidos automáticamente pueden contener errores en el vocabulario, la sintaxis o la gramática, como los que un extranjero podría cometer al hablar el idioma. Microsoft no se hace responsable de cualquier imprecisión, error o daño ocasionado por una mala traducción del contenido o como consecuencia de su utilización por nuestros clientes. Microsoft suele actualizar el software de traducción frecuentemente.

Haga clic aquí para ver el artículo original (en inglés): 201318
Síntomas
Registrar un servidor ATL que tiene un nombre largo de archivo o uno que reside en un directorio con un nombre de ruta de acceso larga, devuelve un error 0 x 80070002:
El sistema no puede encontrar el archivo especificado.
Para archivos DLL, Regsvr32.exe devuelve este error. Para archivos exe, la llamada a Module::RegisterServer (CComModule::RegisterServer) en _tWinMain() devuelve este error.
Causa
Código de registro de ATL utiliza GetShortPathName() para recuperar el nombre corto del archivo y utiliza el nombre corto para el registro. GetShortPathName() se produce un error si el archivo no tiene un nombre de archivo corto. Es el comportamiento predeterminado en Windows NT, Windows 95 y Windows 98 crear automáticamente los nombres de archivo cortos (formato 8.3) para los archivos con nombres largos. Puede desactivar esta opción con el "sistema de directiva de Editor" (Poledit.exe). Algunos sistemas de archivos no admiten la creación de nombres cortos de forma predeterminada. ATL intenta utilizar el nombre de archivo no válido devuelto por GetShortPathName() en una llamada a LoadLibraryEx() y se produce un error con 0 x 80070002.
Solución
Cuando se llama a GetShortPathName() en el origen de ATL, agregue código para comprobar si se ha ejecutado correctamente. Deben modificar las siguientes funciones:
  • CComModule::UpdateRegistryFromResourceS(UINT...) - ATLBASE.H, línea 4933.
  • CComModule::UpdateRegistryFromResourceS(LPCTSTR...) - ATLBASE.H, línea 4965.
  • AtlModuleUpdateRegistryFromResourceD() - ATLBASE.H, line5896.
Cambie las siguientes líneas de:
// 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);				
a la siguiente:
// 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);				
En CComModule::RegisterClassHelper (ATLBASE.H, línea 5044), modifique las siguientes líneas de:
// 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);				
a la siguiente:
// 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);				
Estos cambios no tienen ningún resultado si se genera para ReleaseMinSize, porque el código en ATL.dll se utiliza en su lugar.
Estado
Microsoft ha confirmado que se trata de un error en los productos de Microsoft que se enumeran al principio de este artículo. Este error se corrigió en Visual Studio 6.0 Service Pack 3.
Para obtener más información, haga clic en el siguiente número de artículo para verlo en Microsoft Knowledge Base:
194295 Cómo: Saber que están instalados los Service Pack de Visual Studio 6.0
Para obtener más información, haga clic en el siguiente número de artículo para verlo en Microsoft Knowledge Base:
194022 INFO: Visual Studio 6.0 Service Pack, qué, dónde, por qué

Más información
ATL registra los servidores utilizando el nombre de archivo corto para evitar un error en la función de Windows NT CreateProcess().

Para obtener más información, haga clic en el siguiente número de artículo para verlo en Microsoft Knowledge Base:
179690 REVISIÓN: Lanzamiento servidor COM con el nombre de archivo largo devuelve 0 x 80080005
Para obtener más información, haga clic en el siguiente número de artículo para verlo en Microsoft Knowledge Base:
173673 Herramientas de Windows NT Server para Windows NT Workstation 4.0 disponible

Referencias
Para obtener más información, haga clic en el siguiente número de artículo para verlo en Microsoft Knowledge Base:
179690 Error: TCProps.dll no se registra durante la instalación
80070002

Advertencia: este artículo se tradujo automáticamente

Propiedades

Id. de artículo: 201318 - Última revisión: 03/29/2015 23:11:00 - Revisión: 4.0

Microsoft ActiveX Template Library 3.0

  • kbbug kbfaq kbfix kbregistry kbvs600sp3fix kbmt KB201318 KbMtes
Comentarios