2009-10-19 5 views
7

Delphiでこれらの名前を解くことは可能ですか? もしそうなら、どこで詳しい情報を入手できますか?Delphi - BPLの名前を解く

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

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

私は(私はRTL/VCLソースとデルファイを持っている)、それはDBCOMMONユニット内のメソッドGetTableNameFromSQLExですけど、時々私ははい、クライアントは必ず買うべき(のためではないすべてのコードが利用可能であるアプリケーションにぶつかりますサードパーティのもののすべてのソースコードですが、時にはそうではありません)。

しかし、これはコードがないか、インターフェイスファイル(BDE.INTの誰ですか?)だけの例です。 どのようなパラメータがありますか? 返品の種類はありますか?

このマングリングは、どのデルファイバージョンでも同じですか?

--jeroen

編集1

ロブ・ケネディのおかげ:tdump -e dbrtl100.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:TOndrejへ

おかげでこのGerman EDN articleEnglish Google Translation)を発見しました。 この記事では、フォーマットをかなり正確に説明しており、これを解消するためのDelphiコードを作成することは可能です。

筆者が言及したウェブサイト(および電子メール)は現在死んでいるが、この情報を知っていることは良いことだ。デルファイ2007ソースファイルから

--jeroen

答えて

7

Delphiには関数名を解く関数がありません。どこにでも記述されていることはわかりません。 Delphi in a Nutshellには、 "tdump"ユーティリティには-umスイッチがあり、見つけたシンボルを解き放つことができます。私はそれを試したことはありません。

 
tdump -um -e dbrtl100.bpl 

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

パラメータタイプは、タイプ名の文字カウントの後に、前と同じ「@」区切りのフォーマットが続くように符号化されます。

"$"は、関数名の終わりとパラメータ型の開始を示すために必要です。残りの謎は "qqrx"の部分です。それは記事Tondrej foundによって明らかにされています。 「qqr」は呼び出し規約を示し、この場合はレジスタ、a.k.a. fastcallです。 「x」はパラメータに適用され、定数であることを意味します。

オーバーロードでは戻り値の型が考慮されないため、戻り値の型は、変換された関数名にエンコードする必要はありません。

+0

ありがとうございます - これは役立ちます。実際、-umは必要ありません。これはちょうど動作します: C:\ WINDOWS \ system32> tdump -e dbrtl100.bpl | grep GetTableNameFromSQLEx ファイルSTDIN: 00026050 1385 04AC __fastcall Dbcommon :: GetTableNameFromSQLEx(constシステム:: WideString、Dbcommon :: IDENTIFIEROption) –

+0

私はそれが最近の拡張だと思います。私は確かにtdumpが必ずしもそうしていないと確信しています。 –

0

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

これは私がまた私のWindows \ System32フォルダ内の同じ.BPLを持っているので、同じバージョンであるように思われます。

ソースは[プログラムファイルのフォルダ] \ CodeGearの\ RAD Studioの\ 5.0 \ソースで見つけることができます \ Win32の\デシベル

のBorland/CodeGearの/エンバカデロは今しばらくの間、このエンコーディングを使用し、約多くの詳細を与えたことがない

.BPL形式。私は自分のプロジェクトでランタイムライブラリを使うのが嫌いなので、あまり興味がありませんでした。私は私のプロジェクトにそれらをコンパイルすることを好みますが、これにより実行可能ファイルがはるかに大きくなります。

+0

実際、私はそれがどれかを知っています:Delphi 2007 update 3、DBCommon。 これは、あなたがソースを持っていない、またはソースを捜す必要があるBPLのためのものです。 私の質問に言い換えました。不便をおかけして申し訳ありません:-) –

7

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

+0

ありがとうございます。私はドイツ語を読んでいるので、問題ありません。今私は2つの答えを受け入れる:-) –

6

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

+1

Briljant!それがいつ導入されたのか? D2010-Enterprise \ source \ ciscrtl \ Source \ misc \ unmangle.c 良い読書の素材:私は、2009年と2010年のバージョンを持っているようだ:D2009-Enterprise \ source \ cpprtl \ Source \ misc \ unmangle.c D2010- - ) –

+2

これはBCC自体の長さと同じくらいだと思います。しかし、古いバージョンではunmangle.cではなくum.cと呼ばれていました。 –

関連する問題