フォーラム


ゲスト  

ようこそ ゲスト さん。このフォーラムに投稿するには 登録が必要です。

ページ: [1]
トピック: DCU32INT - Delphi Compiled Units Parser
DEKO
管理者
投稿数: 2691
DCU32INT - Delphi Compiled Units Parser
on: 2017/06/16 02:59 Fri

引用 @owlsperspective on Twitter 2017/06/15 19:22 https://twitter.com/owlsperspective/status/875297347256762369

Delphiの無料版であるStarter SKUにソースがついていない(それ自体はやむを得ないが)ために
宣言のたぐいがエディタから見えなくて(ヘルプにはあるけど)初心者に全く優しくない件、
昔のPersonal SKUにはソース(ユニット)の interface部だけを.intファイルとして同梱してくれていたんだけど、
現在はそういうものも入っていない。

で探してみたらDelphi Compiled Units Parser (http://hmelnov.icc.ru/DCU/index.eng.html) というのがあって、
10.1 Berlinまでの対応なんだけど.dcuから逆コンパイルしてある程度宣言、定義を出力してくれるツールがあった。
ただしライセンスで逆コンパイル、リバースエンジニアリングが禁止されていた気がするので、
限りなく黒に近いグレーだということは明記しておく。

10.2 Tokyoについてはソースコードを数カ所変更することで対応できてるっぽい。
Starter SKUは入門用だと思うので、こんなことしなくてもいいように配慮をしてくれればいいのだけれども、
とりあえずそんな手もあるということで。忘れないようにメモ。

 
っちゅー事で 10.2 Tokyo 対応してみるよ。2 ファイルだけいじればいいよ。

[ DCU32.pas ]
10.2 TOKYO 用の定義 (verD_10_2) を追加し、MaxDelphiVer を 25 に変更するよ。

const {My own (AX) codes for Delphi/Kylix versions}
verD2=2;
verD3=3;
verD4=4;
verD5=5;
verD6=6;
verD7=7;
verD8=8;
verD2005=9; //2005
verD2006=10; //2006
verD2009=12; //2009
verD2010=14; //2010
verD_XE=15; //XE
verD_XE2=16; //XE2
verD_XE3=17; //XE3
verD_XE4=18; //XE4
verD_XE5=19; //XE5
verD_XE6=20; //XE6
//verAppMethod=20; //AppMethod
verD_XE7=21; //XE7&AppMethod
verD_XE8=22; //XE8
verD_10=23; //10 Seattle
verD_10_1=24; //10.1 Berlin
verD_10_2=25; //10.2 Tokyo // ADD 10.2 TOKYO
verK1=100; //Kylix 1.0
verK2=101; //Kylix 2.0
verK3=102; //Kylix 3.0
MaxDelphiVer = 25; // MOD 10.2 TOKYO

 
10.2 TOKYO 用の定義を追加するよ。

function TUnit.GetVersionStr: String;
const
verStrDelphi: array[0..MaxDelphiVer]of String = (
'Error','Error 1','2','3','4','5','6','7','8','2005','2006','?2007','2009',
'Error 13','2010','XE','XE2','XE3','XE4','XE5','XE6','XE7','XE8','10 Seattle','10.1 Berlin', '10.2 Tokyo'); // MOD 10.2 TOKYO
platfStr: array[TDCUPlatform]of String = ('Win32','Win64','Osx32',
'iOSEmulator','iOSDevice','iOSDevice64','Android');

 
最初の BVer が 10.1 Berlin ($1F) になっているのでここを $20 に変更するよ。

function TUnit.ReadMagic(Magic: ulong): Boolean;

...

if (BVer<=$20{10_2Tokyo})and(BVer>=$1B{XE6})and(PlMagic=$4D)or // MOD 10.2 TOKYO
(BVer<=$1A{XE5})and(BVer>=$17{XE2})and(PlMagic=$4B)

 

[ DCUTbl.pas ]
10.2 TOKYO 用の定義を追加するよ。直前の 10.1 Berlin の所にカンマを追加するのを忘れずにね。

function GetVerTag(Ver: integer): String;
const
sVerName: array[2..MaxDelphiVer]of String = (
'D2',
'D3',
'D4',
'D5',
'D6',
'D7',
'D8',
'D2005', //2005
'D2006', //2006
'',
'D2009', //2009
'',
'D2010', //2010
'XE', //XE
'XE2', //XE2
'XE3', //XE3
'XE4', //XE4
'XE5', //XE5
'XE6', //XE6
'XE7', //XE7&AppMethod
'XE8', //XE8
'10Seattle', //10 Seattle
'10_1Berlin', //10.1 Berlin // MOD 10.2 TOKYO
'10_2Tokyo' //10.2 Tokyo // ADD 10.2 TOKYO
);

 
10.2 TOKYO 用の定義を追加するよ。

function GetDelphiLibDir(VerRq: integer; MSILRq: boolean; PlatformRq: TDCUPlatform): String;
{ Delphi LIB directory autodetection }
{$IFDEF Win32}

...

case VerRq of
verD2..verD7: sPath := Format('SOFTWARE\Borland\Delphi\%d.0',[VerRq]);
verD8: sPath := 'SOFTWARE\Borland\BDS\2.0';
verD2005: sPath := 'SOFTWARE\Borland\BDS\3.0';
verD2006: sPath := 'SOFTWARE\Borland\BDS\4.0';
// verD2007: sPath := 'SOFTWARE\Borland\BDS\5.0'; This version was not detected
verD2009: sPath := 'SOFTWARE\CodeGear\BDS\6.0';
verD2010: sPath := 'SOFTWARE\CodeGear\BDS\7.0';
verD_XE: sPath := 'SOFTWARE\Embarcadero\BDS\8.0';
verD_XE2: sPath := 'SOFTWARE\Embarcadero\BDS\9.0';
verD_XE3: sPath := 'SOFTWARE\Embarcadero\BDS\10.0';
verD_XE4: sPath := 'SOFTWARE\Embarcadero\BDS\11.0';
verD_XE5: sPath := 'SOFTWARE\Embarcadero\BDS\12.0';
//verAppMethod: sPath := 'SOFTWARE\Embarcadero\BDS\13.0'; == verD_XE7
verD_XE6: sPath := 'SOFTWARE\Embarcadero\BDS\14.0';
verD_XE7: sPath := 'SOFTWARE\Embarcadero\BDS\15.0';
verD_XE8: sPath := 'SOFTWARE\Embarcadero\BDS\16.0';
verD_10: sPath := 'SOFTWARE\Embarcadero\BDS\17.0';
verD_10_1: sPath := 'SOFTWARE\Embarcadero\BDS\18.0';
verD_10_2: sPath := 'SOFTWARE\Embarcadero\BDS\19.0'; // ADD 10.2 TOKYO
else
Exit;

 
これで完了だよ。

DCU32INT DCUファイル名 INTファイル名

 
みたいな感じで変換できるよ。詳しくは -? または -h で使い方を確認してね。

DEKO
管理者
投稿数: 2691
Re: DCU32INT - Delphi Compiled Units Parser
on: 2017/06/16 10:22 Fri

謎の文字列置いておきますね。
http://ht-deko.com/software/GenerateInt_001.zip

ページ: [1]
WP Forum Server by ForumPress | LucidCrew
バージョン: 1.7.5 ; ページロード: 0.027 sec.