Pergunta

É possível desmembrar nomes como esses no Delphi?Se sim, onde posso obter mais informações?

Exemplo de uma mensagem de erro em que não pode encontrar uma certa entrada no dbrtl100.bpl. Quero saber qual função exata não pode encontrar (unidade, classe, nome, 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   
---------------------------

Eu sei que é o método GetTableNameFromSQLEx na unidade Dbcommon (tenho Delphi com fontes RTL/VCL), mas às vezes encontro aplicativos onde nem todo o código está disponível (sim, os clientes devem sempre comprar todo o código-fonte para terceiros coisas, mas às vezes não).

Mas diga que este é um exemplo para o qual eu não tenho o código, ou apenas os arquivos de interface (bde.int alguém?) Quais parâmetros ele tem (ou seja,qual sobrecarga potencial)?Que tipo de retorno ele possui?

Essa confusão é a mesma para qualquer versão do Delphi?

--jeroen

Editar 1:

Agradecimentos a Rob Kennedy: tdump -e dbrtl100.bpl faz o truque.Não há necessidade de -um de forma alguma:

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

Editar 2:

Obrigado a TOndrej que encontrou isso Artigo alemão EDN (Tradução do Google em inglês).Esse artigo descreve o formato com bastante precisão e deve ser possível criar algum código Delphi para resolver isso.

Pena que o site mencionado pelo autor (e o e-mail) já esteja morto, mas é bom saber dessa informação.

--jeroen

Foi útil?

Solução

Não há função fornecida com Delphi que não verá nomes de funções, e não estou ciente de que está sendo documentado em nenhum lugar. Delphi em poucas palavras menciona que o utilitário "tdump" tem um -um Mude para torná -lo símbolos não -vernizados que encontra. Eu nunca tentei.

tdump -um -e dbrtl100.bpl

Se isso não funcionar, não parece um esquema muito complicado para se desfazer. Evidentemente, o nome começa com "@" e é seguido pelo nome da unidade e pelo nome da função, separado por outro sinal "@". Esse nome de função é seguido por "$ qqrx" e, em seguida, os tipos de parâmetros.

Os tipos de parâmetros são codificados usando a contagem de caracteres do nome do tipo seguido pelo mesmo formato delimitado "@"-de antes.

O "$" é necessário para marcar o final do nome da função e o início dos tipos de parâmetros. O mistério restante é a parte "QQRX". Isso é revelado pelo artigo Tondrej encontrado. O "qqr" indica a convenção de chamada, que neste caso é registro, também conhecido como FastCall. O "X" se aplica ao parâmetro e significa que ele é constante.

O tipo de retorno não precisa ser codificado no nome da função mutilado porque a sobrecarga não considera os tipos de retorno de qualquer maneira.

Outras dicas

Veja também Este artigo (em alemão). Eu acho que o alcance provavelmente é compatível com a frente, e novos esquemas de maglio são introduzidos em versões posteriores para Delphi para novos recursos de idiomas.

Se você possui o C ++ Builder, consulte $ (BDS) ORERGE CPPPRTL ORERGE MISC UNMANGLE.C - Ele contém o código -fonte para o mecanismo não dado usado pelo TDUMP, o depurador e o vinculador. (C ++ Builder e Delphi usam o mesmo esquema de manobramento.)

Nos arquivos de origem do Delphi 2007:

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

Esta parece ser a mesma versão, pois também tenho o mesmo .BPL na minha pasta Windows\System32.

A fonte pode ser encontrada em [pastas Arquivos de Programas]\CodeGear AD Studio\5.0\source\Win32\db

Borland/Codegear/Embarcadero já usa essa codificação há algum tempo e nunca deu muitos detalhes sobre o formato .BPL.Nunca me interessei muito por eles, pois odeio usar bibliotecas de tempo de execução em meus projetos.Prefiro compilá-los em meus projetos, embora isso resulte em executáveis ​​muito maiores.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top