DetailPage-MSS-KB

Base de Dados de Conhecimento

Artigo: 126845 - Última revisão: quinta-feira, 1 de Setembro de 2005 - Revisão: 4.0

 

Nesta página

Sumário

Compiladores Microsoft C++ codificam os nomes dos símbolos nos programas C++ para incluir informações sobre o tipo de no nome do. Isto é denominado "decoração de nomes" ou "deturpação de nomes." O objectivo deste é garantir a segurança do tipo de ligação. A linguagem do C++ permite função sobrecarga onde funciona com o mesmo nome apenas distinguem entre si pelos tipos de dados dos argumentos para as funções. Decoração de nomes permite linker distinguir entre diferentes versões de funções sobrecarregadas porque os nomes das funções são codificados ou decorados diferente.

Mais Informação

Compilador diferentes fornecedores de ter os seus próprios métodos ou algoritmos para decoração de nomes. Microsoft não publica o algoritmo que os compiladores utilizar para decoração de nomes, uma vez que este poderá ser alterado no futuro. No entanto, por vezes é necessário obter a versão decorada um nome de função. Por exemplo, poderá ser necessário exportar uma função de C++ de uma DLL do Windows por listar na secção de um ficheiro .def utilizado para criar a DLL EXPORTS. (Apesar de o declarar que a função com __declspec (dllexport) é o método preferencial para exportar uma função de C++ utilizando o Visual C++, 32-bit Edition, é ainda válido para utilizar um ficheiro .def com estes produtos.) Para exportar com êxito a função, tem de listar o nome decorado, não o nome no código de origem.

Para todos os produtos listados acima, Microsoft disponibiliza Toolkits do browser. Estes conjuntos de ferramentas fornecem funções que podem interpretar decorado nomes.

Para obter mais informações sobre __declspec(dllexport), clique no número de artigo que se segue para visualizar o artigo na Microsoft Knowledge Base:
132044  (http://support.microsoft.com/kb/132044/ ) Utilizar _declspec(dllimport) e _declspec(dllexport) no código
O código de exemplo seguinte utiliza a função FormatDName na biblioteca de browser, parte do Browser Toolkit. Para transferir o Toolkit de browser, visite o seguinte Web 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 devolve o formato undecorated do nome lhe são transmitido.

Exemplo de código

   /* 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 seguinte funciona com a mais recente Browser 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 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: 126845  (http://support.microsoft.com/kb/126845/en-us/ )
Partilhar
Opções de suporte adicionais
Fóruns de Suporte da Comunidade Microsoft
Contacte-nos directamente
Encontre um parceiro certificado Microsoft
Loja Microsoft