10

Delphiでこのような名前を解読することは可能ですか?もしそうなら、どこでより多くの情報を入手できますか?

dbrtl100.bplで特定のエントリが見つからないエラーメッセージの例どの正確な関数(ユニット、クラス、名前、パラメータなど)が見つからないか知りたい。

---------------------------
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   
---------------------------

それがDbcommonユニットのメソッドGetTableNameFromSQLExであることは知っていますが(私はRTL / VCLソースを備えたDelphiを持っています)、すべてのコードが利用できるわけではないアプリにぶつかることがあります(はい、クライアントは常にサードパーティのすべてのソースコードを購入する必要があります)ものですが、そうでない場合もあります)。

しかし、これは私がコードを持っていない、またはインターフェイスファイル(BDE.INTは誰か?)だけを持っている例だとしましょう。どのパラメータがありますか(つまり、どの潜在的な過負荷)?どのような返品タイプがありますか?

これはどのDelphiバージョンでも同じですか?

--jeroen

編集1

Rob Kennedyに感謝します:tdump-edbrtl100.bplがそのトリックを行います。-umはまったく必要ありません:

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

編集2

このドイツ語のEDN記事英語のGoogle翻訳)を見つけたTOndrejに感謝します。その記事はフォーマットをかなり正確に説明しており、これを解くためのDelphiコードを作成することが可能であるはずです。

作者が言及しているウェブサイト(および電子メール)は現在は機能していませんが、この情報を知っておくとよいでしょう。

--jeroen

4

4 に答える 4

10

関数名を解読する関数はDelphiで提供されておらず、どこにも文書化されていることに気づいていません。一言で言えば、 Delphiは、「tdump」ユーティリティには、検出したシンボルのマングルを解除するための-umスイッチがあると述べています。私はそれを試したことがありません。

tdump -um -e dbrtl100.bpl

それがうまくいかない場合は、自分自身を解き放つための非常に複雑なスキームのようには見えません。明らかに、名前は「@」で始まり、その後に別の「@」記号で区切られたユニット名と関数名が続きます。その関数名の後に「$qqrx」が続き、次にパラメータータイプが続きます。

パラメータタイプは、タイプ名の文字数に続いて、以前と同じ「@」で区切られた形式を使用してエンコードされます。

「$」は、関数名の終わりとパラメータータイプの始まりを示すために必要です。残りの謎は「qqrx」の部分です。それは、トンドレイが見つけた記事によって明らかにされています。「qqr」は呼び出し規約を示します。この場合はレジスタ、別名fastcallです。「x」はパラメータに適用され、定数であることを意味します。

オーバーロードはとにかく戻り型を考慮しないため、戻り型はマングルされた関数名にエンコードする必要はありません。

于 2009-10-19T21:13:29.503 に答える
7

この記事(ドイツ語)も参照してください。マングリングはおそらく下位互換性があると思います。新しいマングリングスキームは、新しい言語機能のために、後のDelphiバージョンで導入されています。

于 2009-10-20T09:32:28.820 に答える
7

C ++ Builderを使用している場合は、$(BDS)\ source \ cpprtl \ Source \ misc \ unmangle.cを確認してください。これには、TDUMP、デバッガー、およびリンカーで使用されるアンマングリングメカニズムのソースコードが含まれています。(C ++ BuilderとDelphiは同じマングリングスキームを使用します。)

于 2010-02-03T21:51:08.077 に答える
0

Delphi 2007のソースファイルから:

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

Windows \ System32フォルダーにも同じ.BPLがあるので、これは同じバージョンのようです。

ソースは[プログラムファイルフォルダー]\CodeGear \ RADStudio \ 5.0 \ source \ Win32\dbにあります

Borland / Codegear / Embarcaderoは、しばらくの間このエンコーディングを使用しており、.BPL形式について多くの詳細を提供したことはありません。プロジェクトでランタイムライブラリを使用するのが嫌いなので、私はそれらにあまり興味がありませんでした。私はそれらを自分のプロジェクトにコンパイルすることを好みますが、これにより実行可能ファイルがはるかに大きくなります。

于 2009-10-19T20:50:59.607 に答える