Numéro d'article: 201318 - Dernière mise à jour: jeudi 28 avril 2005 - Version: 3.0

Vous recevez un message d'erreur «le système ne trouve pas le fichier spécifié» lorsque vous inscrire un serveur ATL avec un nom long

A noterCet article s'applique à un système d'exploitation différent de celui que vous utilisez. Le contenu de l'article qui ne vous concerne peut-être pas est désactivé.
Agrandir tout | Réduire tout

Symptômes

Enregistrement un serveur ATL qui a un nom de fichier long ou une qui réside dans un répertoire avec un nom de chemin d'accès long, renvoie un 0 x 80070002 erreur :
Le système ne peut pas trouver le fichier spécifié.
Pour les DLL, cette erreur est renvoyée par regsvr32.exe. Pour les exe, l'appel à Module::RegisterServer (CComModule::RegisterServer) dans _tWinMain() retourne cette erreur.

Cause

Code de d'enregistrement d'ATL utilise GetShortPathName() pour récupérer le nom court du fichier et utilise le nom court pour l'inscription. GetShortPathName() échoue si le fichier n'est pas ont un nom de fichier court. Le comportement par défaut dans Windows NT, Windows 95 et Windows 98 consiste à créer automatiquement des noms de fichier court (format 8.3) pour les fichiers avec des noms longs. Vous pouvez désactiver cette option à l'aide de la "stratégie éditeur système» (Poledit.exe). Certains systèmes de fichiers également ne prennent pas en charge la création des noms courts par défaut. ATL essaie d'utiliser le nom de fichier non valide renvoyé par GetShortPathName() dans un appel à LoadLibraryEx() et échoue, avec 0 x 80070002.

Résolution

Lorsque GetShortPathName() est appelée dans la source d'ATL, ajoutez le code pour vérifier si elle a réussi. Les fonctions suivantes doivent être modifiées :
  • CComModule::UpdateRegistryFromResourceS(UINT...) - ATLBASE.H, ligne 4933.
  • CComModule::UpdateRegistryFromResourceS(LPCTSTR...) - ATLBASE.H, ligne 4965.
  • AtlModuleUpdateRegistryFromResourceD() - atlbase.H, 5896 de ligne.
Modifier les lignes suivantes à partir 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);
				
à la suivante :
// 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);
				
in CComModule::RegisterClassHelper (atlbase.H, ligne 5044), modifiez les lignes suivantes à partir 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);
				
au suivant :
// 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);
				
ces modifications n'ont aucun résultat si vous créez pour ReleaseMinSize, car le code dans ATL.dll est utilisé à la place.

Statut

Microsoft a confirmé l'existence de ce bogue dans Microsoft produits répertoriés au début de cet article. Ce bogue a été corrigé dans Visual Studio 6.0 Service Pack 3.
Pour plus d'informations, cliquez sur le numéro ci-dessous pour afficher l'article correspondant dans la base de connaissances Microsoft :
194295  (http://support.microsoft.com/kb/194295/ ) Comment faire : Tell ce Service Visual Studio 6.0 Packs sont installés
Pour plus d'informations, cliquez sur le numéro ci-dessous pour afficher l'article correspondant dans la base de connaissances Microsoft :
194022  (http://support.microsoft.com/kb/194022/ ) Information : Visual Studio 6.0 Service Packs, quoi, où, pourquoi

Plus d'informations

ATL inscrit les serveurs à l'aide du nom de fichier court pour résoudre un bogue dans la fonction de CreateProcess() de Windows NT.

Pour plus d'informations, cliquez sur le numéro ci-dessous pour afficher l'article correspondant dans la base de connaissances Microsoft :
179690  (http://support.microsoft.com/kb/179690/ ) CORRECTIF : Lancement serveur COM avec des retours de nom de fichier long 0 x 80080005
Pour plus d'informations, cliquez sur le numéro ci-dessous pour afficher l'article correspondant dans la base de connaissances Microsoft :
173673  (http://support.microsoft.com/kb/173673/ ) Outils Windows NT Server pour Windows NT Workstation 4.0 disponibles

Références

Pour plus d'informations, cliquez sur le numéro ci-dessous pour afficher l'article correspondant dans la base de connaissances Microsoft :
179690  (http://support.microsoft.com/kb/179690/ ) BOGUE : Une TCProps.dll n'arrive pas à enregistrer pendant l'installation

Les informations contenues dans cet article s'appliquent au(x) produit(s) suivant(s):
  • Microsoft ActiveX Template Library 3.0 sur le système suivant
    • Microsoft Visual C++ 6.0 Édition Entreprise
    • Microsoft Visual C++ 6.0 Édition Professionnelle
    • Microsoft Visual C++, 32-bit Learning Edition 6.0
Mots-clés : 
kbmt kbbug kbfaq kbfix kbregistry kbvs600sp3fix KB201318 KbMtfr
Traduction automatiqueTraduction automatique
IMPORTANT : Cet article est issu du système de traduction automatique mis au point par Microsoft (http://support.microsoft.com/gp/mtdetails). Un certain nombre d?articles obtenus par traduction automatique sont en effet mis à votre disposition en complément des articles traduits en langue française par des traducteurs professionnels. Cela vous permet d?avoir accès, dans votre propre langue, à l?ensemble des articles de la base de connaissances rédigés originellement en langue anglaise. Les articles traduits automatiquement ne sont pas toujours parfaits et peuvent comporter des erreurs de vocabulaire, de syntaxe ou de grammaire (probablement semblables aux erreurs que ferait une personne étrangère s?exprimant dans votre langue !). Néanmoins, mis à part ces imperfections, ces articles devraient suffire à vous orienter et à vous aider à résoudre votre problème. Microsoft s?efforce aussi continuellement de faire évoluer son système de traduction automatique.
La version anglaise de cet article est la suivante: 201318  (http://support.microsoft.com/kb/201318/en-us/ )
L'INFORMATION CONTENUE DANS CE DOCUMENT EST FOURNIE PAR MICROSOFT SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE. L'UTILISATEUR ASSUME LE RISQUE DE L'UTILISATION DU CONTENU DE CE DOCUMENT. CE DOCUMENT NE PEUT ETRE REVENDU OU CEDE EN ECHANGE D'UN QUELCONQUE PROFIT.