2009-10-19 13 views
7

¿Es posible desmantelar nombres como estos en Delphi? En caso afirmativo, ¿dónde obtengo más información?Delphi: unmangle nombres en BPL

Ejemplo de un mensaje de error donde no puede encontrar una entrada determinada en dbrtl100.bpl Quiero saber qué función exacta no puede encontrar (unidad, clase, nombre, parámetros, etc.).

--------------------------- 
myApp.exe - Entry Point Not Found 
--------------------------- 
The procedure entry point @[email protected][email protected]@IDENTIFIEROption could not be located in the dynamic link library dbrtl100.bpl. 
--------------------------- 
OK 
--------------------------- 

Sé que es el método GetTableNameFromSQLEx en la unidad DbCommon (tengo Delphi con las fuentes RTL/VCL), pero a veces me encuentro con aplicaciones en las que no todo el código está disponible para (sí, los clientes deben comprar siempre todo el código fuente para cosas de terceros, pero a veces no lo hacen).

Pero diga que este es un ejemplo para el que no tengo el código, o solo los archivos de interfaz (BDE.INT ¿alguien?) ¿Qué parámetros tiene (es decir, qué sobrecarga potencial)? ¿Qué tipo de devolución tiene?

¿Es este problema igual para cualquier versión de Delphi?

--jeroen

Editar 1:

Gracias a Rob Kennedy: tdump -e dbrtl100.bpl hace el truco. No hay necesidad de -um en absoluto:

C:\WINDOWS\system32>tdump -e dbrtl100.bpl | grep GetTableNameFromSQLEx 
File STDIN: 
00026050 1385 04AC __fastcall Dbcommon::GetTableNameFromSQLEx(const System::WideString, Dbcommon::IDENTIFIEROption) 

Editar 2:

Gracias a TOndrej que encontraron esta German EDN article (English Google Translation). Ese artículo describe el formato con bastante precisión, y debería ser posible crear algún código Delphi para destrabar esto.

Pitty que el sitio web que el autor menciona (y el correo electrónico) ahora están muertos, pero es bueno saber esta información.

--jeroen

Respuesta

7

No hay ninguna función provista con Delphi que desmarque nombres de funciones, y no estoy al tanto de que esté documentado en ninguna parte. Delphi in a Nutshell menciona que la utilidad "tdump" tiene un interruptor -um para hacer que destrabe los símbolos que encuentra. Nunca lo intenté.

 
tdump -um -e dbrtl100.bpl 

Si eso no funciona, entonces no parece un esquema muy complicado para destrabarse. Evidentemente, el nombre comienza con "@" y es seguido por el nombre de la unidad y el nombre de la función, separados por otro signo "@". Ese nombre de función es seguido por "$ qqrx" y luego los tipos de parámetros.

Los tipos de parámetros se codifican utilizando el recuento de caracteres del nombre de tipo seguido del mismo formato delimitado "@" de antes.

El "$" es necesario para marcar el final del nombre de la función y el inicio de los tipos de parámetros. El misterio restante es la parte "qqrx". Eso es revelado por el artículo Tondrej found. El "qqr" indica la convención de llamada, que en este caso es registro, a.k.a. llamada rápida. La "x" se aplica al parámetro y significa que es constante.

No es necesario codificar el tipo de devolución en el nombre de la función destruida porque la sobrecarga no considera los tipos de devolución de todos modos.

+0

Gracias, esto ayuda. En realidad, el -um no es necesario en absoluto. Esto solo funciona: C: \ WINDOWS \ system32> tdump -e dbrtl100.bpl | grep GetTableNameFromSQLEx Archivo STDIN: 00026050 1385 04AC __fastcall Dbcommon :: GetTableNameFromSQLEx (const System :: WideString, Dbcommon :: IDENTIFIEROption) –

+0

Creo que es una mejora reciente, entonces. Estoy bastante seguro de que Tdump no siempre ha hecho eso. –

0

A partir de los archivos de código fuente Delphi 2007:

function GetTableNameFromSQLEx(const SQL: WideString; IdOption: IDENTIFIEROption): WideString; 

Esta parece ser la misma versión, ya que también tengo el mismo .bpl en mi carpeta Windows \ System32.

Fuente se puede encontrar en [Archivos de programa carpetas] \ CodeGear \ RAD Studio \ 5.0 \ source \ Win32 \ db

Borland/CodeGear/Embarcadero ha utilizado esta codificación desde hace un tiempo y nunca dio muchos detalles acerca el formato .BPL. Nunca he estado muy interesado en ellos ya que odio usar bibliotecas de tiempo de ejecución en mis proyectos. Prefiero compilarlos en mis proyectos, aunque esto dará como resultado ejecutables mucho más grandes.

+0

En realidad, sé cuál es: Delphi 2007 update 3, DBCommon. Esto fue más para los BPL para los cuales no tiene fuentes, o necesita buscar las fuentes. Reformé mi pregunta. Perdón por la inconveniencia :-) –

7

Ver también this article (en alemán). Supongo que el cambio es probablemente compatible con versiones anteriores, y los nuevos esquemas de manipulación se introducen en versiones posteriores de Delphi para las nuevas características del lenguaje.

+0

Gracias. Leo alemán, así que no hay problema. Ahora quiero aceptar dos respuestas :-) –

6

Si tiene C++ Builder, consulte $ (BDS) \ source \ cpprtl \ Source \ misc \ unmangle.c - contiene el código fuente para el mecanismo de desenrollado utilizado por TDUMP, el depurador y el enlazador. (C++ Builder y Delphi usan el mismo esquema de manipulación).

+1

Briljant! ¿Desde cuándo fue presentado? Parece que solo tengo las versiones 2009 y 2010 de ellos: D2009-Enterprise \ source \ cpprtl \ Source \ misc \ unmangle.c D2010-Enterprise \ source \ cpprtl \ Source \ misc \ unmangle.c Buen material de lectura: -) –

+2

Creo que esto ha durado tanto como el propio BCC. Sin embargo, el archivo se llamaba um.c en lugar de unmangle.c en versiones anteriores. –

Cuestiones relacionadas