Artigo: 220137 - Última revisão: sexta-feira, 29 de Setembro de 2006 - Revisão: 2.3

MIDL altera o caso de identificador de biblioteca de tipos gerado

Dica do SistemaEste artigo aplica-se a um sistema operativo diferente do que está a utilizar. Foi desactivado o conteúdo do artigo, que pode não ser relevante para si.

Nesta página

Expandir tudo | Reduzir tudo

Sintomas

Quando existem dois identificadores que diferem apenas caso, o caso do segundo identificador é alterado para reflectir o caso do primeiro.

Causa

A biblioteca IDL e escrever não são sensíveis a maiúsculas / minúsculas por predefinição. O código de automatização OLE que seja invocado pelo MIDL para gerar a biblioteca de tipos está a ser a primeira ocorrência de um nome e quaisquer ocorrências subsequentes com o mesmo nome em IDL, mesmo que esteja no contexto diferente, o mesmo.

Resolução

Seguem-se soluções alternativas que pode utilizar para evitar este problema:
  • No caso de importar um ficheiro IDL para outro, a possibilidade desta situação é maior. Em vez de importar IDL ficheiros para outro IDL, importe uma biblioteca de tipo correspondente.
  • Assegurar que o mesmo nome não seja já presente no ficheiro IDL quando introduzir um novo identificador.
  • Mapear o identificador gerado na biblioteca de tipos com a documentação de componentes. Isto realmente não é demasiado difícil uma vez que quaisquer identificadores que diferem apenas caso será um contexto diferente que seja um um método e outra um parâmetro, a estrutura e assim sucessivamente. Isto irá ajudar a evitar discrepância na documentação do componente.

Ponto Da Situação

Este comportamento ocorre por predefinição.

Mais Informação

Se tiver um ficheiro IDL diferentes dois identificadores com o mesmo nome mas são diferentes apenas no caso e o MIDL gerado biblioteca de tipos alterará o segundo identificador para o mesmo formato que o primeiro.

Passos para reproduzir o comportamento

  1. Crie um ficheiro IDL (name.idl). Consulte o seguinte exemplo:
    // 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. Utilize o compilador MIDL para gerar biblioteca de tipos. Utilizar o name.idl MIDL de comandos
  3. Abra a biblioteca de tipos gerada no OLEVIEW. Consulte o seguinte resultado OLEVIEW.
    // 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. Aqui o nome de método MyName em Interface2 foi alterado para meunome.

A informação contida neste artigo aplica-se a:
  • Microsoft Platform Software Development Kit-January 2000 Edition nas seguintes plataformas
    • Microsoft Windows NT Server 4.0 Standard Edition
    • Microsoft Windows NT Workstation 4.0 Developer Edition
Palavras-chave: 
kbmt kbbug kbpending KB220137 KbMtpt
Tradução automáticaTradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine translation ou MT), não tendo sido portanto revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 220137  (http://support.microsoft.com/kb/220137/en-us/ )