MIDL altera o caso de identificador de biblioteca de tipos gerados

Traduções deste artigo Traduções deste artigo
ID do artigo: 220137 - Exibir os produtos aos quais esse artigo se aplica.
Expandir tudo | Recolher tudo

Neste artigo

Sintomas

Quando há dois identificadores que diferem somente por caso, o caso do identificador do segundo é alterado para refletir o caso do primeiro.

Causa

A biblioteca de IDL e tipo não são maiúsculas de minúsculas de design. O código de automação OLE que é chamado pelo MIDL para gerar a biblioteca de tipos está demorando a primeira ocorrência de um nome e quaisquer ocorrências subseqüentes do mesmo nome em IDL, mesmo que esteja no contexto de diferente, para ser o mesmo.

Resolução

Soluções alternativas que você pode usar para evitar esse problema são:
  • No caso de importar um arquivo IDL para outro, a possibilidade de que isso ocorra é superior. Em vez de importar arquivos de IDL para outro IDL, importe uma biblioteca de tipos correspondente.
  • Verifique se que o mesmo nome não já está presente no arquivo IDL quando apresentando um novo identificador.
  • Mapear o identificador gerado na biblioteca de tipo com a documentação de componentes. Isso realmente não é muito difícil desde qualquer identificadores que diferem somente por caso serão em um contexto diferente é, um método de um e outro um parâmetro, estrutura e assim por diante. Isso ajudará a evitar discrepância na documentação do componente.

Situação

Esse comportamento é por design.

Mais Informações

Se um arquivo IDL tem dois diferentes identificadores com o mesmo nome mas diferem apenas no caso, o MIDL gerado pelo Type Library alterará o segundo identificador para o caso mesmo que o primeiro.

Etapas para reproduzir o comportamento

  1. Crie um arquivo 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. Use o compilador MIDL para gerar biblioteca de tipos. Use o comando MIDL name.idl
  3. Abra a biblioteca de tipos gerada no OLEVIEW. Consulte o seguinte OLEVIEW saída.
    // 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 do método meu-nome no Interface2 foi alterado para meunome.

Propriedades

ID do artigo: 220137 - Última revisão: sexta-feira, 29 de setembro de 2006 - Revisão: 2.3
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á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 traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 220137

Submeter comentários

 

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