2012-02-07 16 views
9

At a post of Raymond Chen, parece ser capaz de conocer el nombre sin decorar de la función del nombre decorado. No tengo idea de cómo podría hacer esto.Cómo descodificar el nombre del nombre decorado?

En este nombre decorado,

? GetName @ @ PushButton UILibrary @@ @@ 2 @ UAEPB_WPAPAVStringHolder Z

¿Qué quiere decir el que cada componente?

+1

Consulte la documentación de su implementación o juegue un poco con un demandedor y conozca los patrones más comunes. – Xeo

+0

La respuesta está en el blog. "Pedimos el programa undname". Con un poco de capacitación, puede leer esos nombres usted mismo, solo genere algunos nombres decorados de fuentes que conoce, pero las reglas completas son complejas (ya que el sistema de tipo C++ es complejo) y no vale la pena descubrirlas y aprenderlas. – Suma

+0

Posible duplicado de http://stackoverflow.com/q/1617204/471164 – vitaut

Respuesta

12

Para evitar adivinar, y aún no usar herramientas, el UndecorateSymbolName function puede ser útil. Espero que brinde una respuesta correcta y autorizada.

Para hacerlo manualmente, this page tiene alguna información sobre el esquema, al igual que these.

El esquema básico es [email protected]@[email protected]@[email protected]@@something. Sospecho que las últimas dos partes son tamaño de pila y convención de llamadas o similar, pero la documentación probablemente tenga más detalles.

+0

+1 Gracias por el enlace. Mucho más complicado de lo que esperaba, aunque -_-; – Benjamin

+0

El fragmento más grande (nombre y ámbitos que lo contienen) es bastante simple, solo se enumera en orden inverso. Aparentemente, el prefijo está bastante bien documentado, y he visto (pero no puedo encontrar) el esquema de los parámetros. – ssube

6

El cambio de nombre depende del compilador.

En el artículo que vinculó, Raymond está utilizando una utilidad de MS (undname) para eliminar el cambio.

Here is a table que muestra cómo los compiladores comunes mangle.

+0

+1, incluso Raymond lo dice explícitamente. – sharptooth

+1

Con la etiqueta 'visual-studio', la pregunta también depende del compilador, y esto no ayuda a responderla en absoluto. – ssube

+0

Sí, lo vi, pero creo que podría exigir el nombre por sí mismo en el último ejemplo simple. De acuerdo, ¿entonces no hay forma de adivinarlo fácilmente? – Benjamin

4

Microsoft Visual Studio viene con una herramienta undname.exe.

http://msdn.microsoft.com/en-us/library/ms937379.aspx

Si tiene MS VS en una ubicación predeterminada que puede utilizar:

"C: \ Archivos de programa (x86) \ Microsoft Visual 10,0 \ VC \ bin \ undname.exe Estudio "? GetName @ PushButton @ UILibrary @@ UAEPB_WPAPAVStringHolder @ 2 @@ Z

Microsoft (R) C++ Nombre Undecorator Copyright (C) Microsoft Corporation. Todos los derechos reservados.

Undecoration de: - es "GetName @ @ PushButton UILibrary @@ @@ 2 @ UAEPB_WPAPAVStringHolder Z?": - "público: Virtual const wchar_t * __thiscall UILibrary :: :: PushButton GetName (UILibrary clase :: StringHolder * *) "

Cuestiones relacionadas