DetailPage-MSS-KB

Base de Dados de Conhecimento

ID do artigo: 126845 - Última revisão: quinta-feira, 1 de setembro de 2005 - Revisão: 4.0

 

Nesta página

Sumário

Os compiladores de C++ Microsoft codificam os nomes dos símbolos em programas do C++ para incluir informações de tipo no nome. Isso é chamado "decoração de nome" ou "desconfiguração do nome." O objetivo é garantir a vinculação de tipo seguro. A linguagem C++ permite a função sobrecarga onde funções com o mesmo nome são apenas distinguidas uns dos outros pelos tipos de dados dos argumentos para as funções. Decoração de nome permite que o vinculador a distinção entre versões diferentes de funções sobrecarregadas porque os nomes das funções são codificados ou decorados de maneira diferente.

Mais Informações

Compilador de diferentes fornecedores possuem seus próprios métodos ou algoritmos para nomes de decoração. Microsoft não publica o algoritmo que usar seus compiladores para decoração de nome porque ele pode ser alterado no futuro. No entanto, às vezes, é necessário obter a versão decorada de um nome de função. Por exemplo, talvez seja necessário exportar uma função de C++ de uma DLL Windows listando-a na seção de um arquivo .def usado para criar a DLL EXPORTS. (Embora declarar que a função com __declspec (dllexport) é o método preferencial para exportar uma função de C++ usando o Visual C++, 32-bit Edition, é ainda válida para usar um arquivo .def com esses produtos.) Para exportar a função com êxito, você precisará listar seu nome decorado, não o nome no código-fonte.

Para todos os produtos listados acima, Microsoft disponibiliza Kits de ferramentas do navegador. Esses kits de ferramentas fornecem funções que podem interpretar decorada nomes.

Para obter mais informações sobre __declspec(dllexport), clique no número abaixo para ler o artigo na Base de dados de Conhecimento da Microsoft:
132044  (http://support.microsoft.com/kb/132044/ ) Usando _declspec(dllimport) e _declspec(dllexport) no código
O código de exemplo a seguir utiliza a função FormatDName na biblioteca de navegador, parte do Toolkit navegador. Para baixar o Toolkit do navegador, visite o seguinte site da Microsoft:
http://www.microsoft.com/downloads/details.aspx?FamilyID=621ae185-1c2a-4d6b-8146-183d66fe709d&displaylang=en (http://www.microsoft.com/downloads/details.aspx?FamilyID=621ae185-1c2a-4d6b-8146-183d66fe709d&displaylang=en)
A função retornará o formulário não decorado de nome passado para ele.

Código de exemplo

   /* Compile options needed: cl /AL getname.cpp bthunkl.obj /link bsc.lib
          (for 16-bit, where getname.cpp is the source file name)
                              cl getname.cpp /link bsc.lib
          (for 32-bit version 4.x and earlier, where getname.cpp is the source
           file name)
   */ 

   #include <iostream.h>
   #include <strstrea.h>

   extern "C"
   {
   #include "hungary.h"
   #include "bsc.h"
   #include "bscsup.h"
   }

   void main( int argc, char *argv[] )
   {
       if ( argc < 2 )
       {
           cout << "Usage: GETNAME decorated-name" << endl;
           return;
       }

       strstream name;

       // Call browser library function to get undecorated name
       name << FormatDname ( argv[1] ) << '\0';

       cout << "Undecorated name: " << name.str() << endl;
       name.rdbuf()->freeze( 0 );
   }
				
O exemplo a seguir funciona com a mais recente navegador Toolkit 5.0 e Visual C++ versão 5.0.
   /* Compile options needed: cl /GX getname.cpp /link msbsc50.lib
          (where getname.cpp is the source file name)
   */ 

   #include <iostream>
   #include <strstream>
   #include <windows.h>
   #include "bsc.h"

   using namespace std;

   int main( int argc, char *argv[] )
   {
       Bsc* pbsc;

       if ( argc < 3 )
       {
           cout << "Usage: GETNAME bscfile-name decorated-name" << endl;
           return 1;
       }

       strstream name;

       // Open the browser file
       Bsc::open( argv[1], &pbsc );

       // Call browser library function to get undecorated name
       name << pbsc->formatDname( argv[2] ) << '\0';

       cout << "Undecorated name: " << name.str() << endl;
       name.rdbuf()->freeze( 0 );

       pbsc->close();
       return 0;
   }
				

A informação contida neste artigo aplica-se a:
  • Microsoft Visual C++ 1.5 Professional Edition
  • Microsoft Visual C++ 1.51
  • Microsoft Visual C++ 1.52 Professional Edition
  • Microsoft Visual C++ 2.0 Professional Edition
  • Microsoft Visual C++ 2.1
  • Microsoft Visual C++ 4.0 Standard Edition
  • Microsoft Visual C++ 4.1 Subscription
  • Microsoft Visual C++ 5.0 Enterprise Edition
  • Microsoft Visual C++ 6.0 Enterprise Edition
  • Microsoft Visual C++ 5.0 Professional Edition
  • Microsoft Visual C++ 6.0 Professional Edition
  • Microsoft Visual C++, 32-bit Learning Edition 6.0
Palavras-chave: 
kbmt kbcode kbcompiler kbcpponly kbinfo KB126845 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 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: 126845  (http://support.microsoft.com/kb/126845/en-us/ )
Compartilhar
Opções de suporte adicionais
Fóruns de Suporte do Microsoft Community
Contate-nos diretamente
Localize um parceiro certificado da Microsoft
Microsoft Store