Pregunta

¿Es posible unmangle nombres como estos en Delphi? Si es así, ¿dónde puedo obtener más información?

Ejemplo de un mensaje de error en el que no puede encontrar una cierta entrada en el 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 @Dbcommon@GetTableNameFromSQLEx$qqrx17System@WideString25Dbcommon@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 la materia de tercera parte, pero a veces no lo hacen).

Pero decir que esto es un ejemplo para los que no tengo el código, o sólo los archivos de interfaz (BDE.INT alguien?) ¿Qué parámetros ¿tiene (es decir, que el potencial de sobrecarga)? ¿Qué tipo de retorno tiene?

Es esta destrozando la misma 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 alemán EDN artículo ( Inglés Google Traductor ) . En dicho artículo se describe el formato con bastante exactitud, y debería ser posible crear un código de Delphi a unmangle esto.

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

- Jeroen

¿Fue útil?

Solución

No hay ninguna función proporcionada con Delphi que Will nombres de función unmangle, y no estoy al tanto de que sea documentado en cualquier lugar. Delphi en una cáscara de nuez menciona que el "tdump "utilidad tiene un um cambiar para que sea unmangle símbolos que encuentra. Nunca lo he probado.

tdump -um -e dbrtl100.bpl

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

Los tipos de parámetros se codifican mediante el recuento de caracteres del nombre del tipo seguido por el mismo "@" -. Formato delimitado de delante

El "$" es necesaria para marcar el final del nombre de la función y el inicio de los tipos de parámetros. El misterio que queda es la parte "qqrx". Eso es marcado por el artículo Tondrej encontró . El "QQR" indica la convención de llamada, que en este caso es registrar , alias fastcall . La "x" se aplica al parámetro y significa que es constante.

no necesita el tipo de retorno a codificar en el nombre de función despedazado debido a la sobrecarga no tiene en cuenta los tipos de retorno de todos modos.

Otros consejos

También vea este artículo (en alemán) . Creo que la mangling es probablemente compatible con versiones anteriores y nuevos esquemas de calandrado se introducen en posteriores versiones de Delphi para las nuevas características del lenguaje.

Si usted tiene C ++ Builder, echa un vistazo a $ (BDS) \ source \ cpprtl \ Source \ misc \ unmangle.c - que contiene el código fuente para el mecanismo utilizado por unmangling TDUMP, el depurador y el enlazador. (C ++ Builder y Delphi utilizan el mismo esquema mangling.)

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 [carpetas Archivos de programa] \ 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 sobre el formato de .bpl. Nunca he estado muy interesado en ellos ya que me gusta el uso de bibliotecas de ejecución en mis proyectos. Yo prefiero compilarlos en mis proyectos, aunque esto se traducirá en ejecutables mucho más grandes.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top