MIDL modifie la casse d'identificateur de la bibliothèque de types générée

Traductions disponibles Traductions disponibles
Numéro d'article: 220137 - Voir les produits auxquels s'applique cet article
Agrandir tout | Réduire tout

Sommaire

Symptômes

Lorsqu'il y a deux identificateurs qui ne diffèrent que par la casse, la casse de la deuxième identificateur est modifiée pour refléter le cas de la première.

Cause

Bibliothèque IDL et type ne respectent pas la casse par sa conception. Le code de OLE Automation qui est appelé par MIDL pour générer la bibliothèque de type prend la première occurrence d'un nom et tout occurrences suivantes du même nom dans l'IDL, même s'il s'agit d'une autre contexte, la même.

Résolution

Solutions de contournement que vous pouvez utiliser pour éviter ce problème sont les suivantes :
  • Dans le cas d'importation un fichier IDL vers un autre, la possibilité de cette situation est plus élevée. Au lieu d'importer des fichiers IDL dans un autre IDL, importer une bibliothèque de type correspondant.
  • Assurez-vous que le même nom n'est pas déjà présent dans le fichier IDL avant de commencer un nouvel identificateur.
  • Mapper l'identificateur généré dans la bibliothèque de type avec la documentation de composants. Ceci est vraiment pas trop difficile depuis tous les identificateurs ne diffèrent que par la casse seront dans un contexte différent est, une méthode et l'autre un paramètre, la structure et l'ainsi de suite. Cela contribue à éviter l'incohérence dans la documentation du composant.

Statut

Ce comportement est voulu par la conception même du produit.

Plus d'informations

Si un fichier IDL comporte deux différents identificateurs portant le même nom mais ne diffèrent que par le cas, alors le MIDL généré la bibliothèque de types passera le deuxième identificateur à la même casse que le premier.

Procédure pour reproduire le comportement

  1. Créer un fichier IDL (name.idl). Consultez l'exemple suivant :
    // Test program to demonstrate capitalization bugs in MIDL 5.02.0235
    import "oaidl.idl";
    import "ocidl.idl";
    
       [
          uuid(DB9DDB0D-8834-11D1-8278-00A024A41CC8),
          dual,
          oleautomation,
       ]
       interface Interface1 : IDispatch {
          [ id(4), helpstring("") ]
          HRESULT OtherMethod (
             // This parm name will affect the case of the subsequent method name.
             [in] VARIANT_BOOL mYnAme );
       };
    
    
       [
          uuid(DB9DDB0C-8834-11D1-8278-00A024A41CC8),
          dual,
          oleautomation,
       ]
       interface Interface2 : IDispatch {
          [ id(5), helpstring("") ]
          // The method name gets changed.
          HRESULT MyName ();
       };
    
    
    [  uuid(2A216780-BC52-11D2-B94F-00C04F81B63A), version(1.0),
    ]
    library MIDLTST
    {
       importlib("stdole32.tlb");
    
       [
          uuid(65B5C950-883D-11D1-8278-00A024A41CC8),
          helpstring("Exercise various supported types.")
       ]
       coclass MIDLTest {
          [default] interface Interface1;
          interface Interface2;
       };
    };
    						
  2. Utilisez le compilateur MIDL pour générer une bibliothèque de types. Utilisez le name.idl MIDL de commande
  3. Ouvrez la bibliothèque de type généré dans OLEVIEW. Consultez la rubrique suivante OLEVIEW sortie.
    // Generated .IDL file (by the OLE/COM Object Viewer)
    // 
    // typelib filename: <could not determine filename>
    
    [
      uuid(2A216780-BC52-11D2-B94F-00C04F81B63A),
      version(1.0)
    ]
    library MIDLTST
    {
        // TLib :     // TLib : OLE Automation : {00020430-0000-0000-C000-000000000046}
        importlib("STDOLE2.TLB");
    
        // Forward declare all types defined in this typelib
        interface Interface1;
        interface Interface2;
    
        [
          uuid(65B5C950-883D-11D1-8278-00A024A41CC8),
          helpstring("Exercise various supported types.")
        ]
        coclass MIDLTest {
            [default] interface Interface1;
            interface Interface2;
        };
    
        [
          odl,
          uuid(DB9DDB0D-8834-11D1-8278-00A024A41CC8),
          dual,
          oleautomation
        ]
        interface Interface1 : IDispatch {
            [id(0x00000004)]
            HRESULT OtherMethod([in] VARIANT_BOOL mYnAme);
        };
    
        [
          odl,
          uuid(DB9DDB0C-8834-11D1-8278-00A024A41CC8),
          dual,
          oleautomation
        ]
        interface Interface2 : IDispatch {
            [id(0x00000005)]
            HRESULT mYnAme();
        };
    };
    
    						
  4. Ici, le nom de la méthode monnom dans Interface2 a été modifié pour MonNom.

Propriétés

Numéro d'article: 220137 - Dernière mise à jour: vendredi 29 septembre 2006 - Version: 2.3
Les informations contenues dans cet article s'appliquent au(x) produit(s) suivant(s):
  • Microsoft Platform Software Development Kit-January 2000 Edition sur le système suivant
    • Microsoft Windows NT Server 4.0 Standard Edition
    • Microsoft Windows NT Workstation 4.0 Édition Développeur
Mots-clés : 
kbmt kbbug kbpending KB220137 KbMtfr
Traduction 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: 220137
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.

Envoyer des commentaires

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com