2009-10-19 10 views
7

Czy można zamieniać takie nazwy w Delphi? Jeśli tak, to gdzie mogę uzyskać więcej informacji?Delphi - odznacz nazwy w BPL

Przykład komunikatu o błędzie, gdy nie można znaleźć określonego wpisu w dbrtl100.bpl Chcę wiedzieć, której dokładnie funkcji nie można znaleźć (jednostka, klasa, nazwa, parametry itp.).

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

wiem, że jest to sposób GetTableNameFromSQLEx w jednostce Dbcommon (mam Delphi ze źródeł RTL/VCL), ale czasami wpadać aplikacjach, w których nie wszystkie kod jest dostępny dla (tak, klienci powinni zawsze kupić cały kod źródłowy do rzeczy innych firm, ale czasem nie).

Ale powiedz, że jest to przykład, dla którego nie mam kodu, lub tylko pliki interfejsu (BDE.INT ktoś?) Jakie parametry ma to (np. Jakie potencjalne przeciążenie)? Jaki jest typ zwrotu?

Czy jest to podobne rozwiązanie do każdej wersji Delphi?

--jeroen

Edycja 1:

Dzięki Rob Kennedy: tdump -e dbrtl100.bpl załatwia sprawę. Nie potrzeba -um w ogóle:

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

Edycja 2:

Dzięki TOndrej który uznał ten German EDN article (English Google Translation). Ten artykuł dokładnie opisuje format i powinno być możliwe utworzenie kodu Delphi, aby go rozplątać.

Pitta, że ​​strona internetowa, o której wspomina autor (i e-mail), jest już martwa, ale dobrze jest znać te informacje.

--jeroen

Odpowiedz

7

Nie ma funkcji dostarczanej z Delphi, która będzie zamieniała nazwy funkcji i nie mam świadomości, że jest ona dokumentowana w dowolnym miejscu. Delphi in a Nutshell wspomina, że ​​narzędzie "tdump" ma przełącznik -um, aby uczynić go niezmaganym znalezionymi symbolami. Nigdy tego nie próbowałem.

 
tdump -um -e dbrtl100.bpl 

Jeśli to nie zadziała, to nie wygląda bardzo skomplikowanym systemem do unmangle siebie. Najwyraźniej nazwa zaczyna się od "@", po której następuje nazwa jednostki i nazwa funkcji, oddzielone innym znakiem "@". Po tej nazwie funkcji następuje "$ qqrx", a następnie typy parametrów.

Typy parametrów są kodowane za pomocą liczby znaków nazwy typu, po której następuje ten sam format "@" - z ograniczeniem.

"$" jest konieczne, aby oznaczyć koniec nazwy funkcji i początek typów parametrów. Pozostała tajemnica to część "qqrx". Zostało to ujawnione w artykule Tondrej found. "Qqr" wskazuje konwencję wywołującą, która w tym przypadku to rejestr, a.k.a. fastcall. "X" odnosi się do parametru i oznacza, że ​​jest stały.

Zwracany typ nie musi być zakodowany w nazwie funkcji zniekształconej, ponieważ przeciążenie i tak nie uwzględnia typów zwrotów.

+0

Dzięki - to pomaga. W rzeczywistości -um nie jest w ogóle potrzebne. To po prostu działa: C: \ WINDOWS \ system32> tdump -e dbrtl100.bpl | grep GetTableNameFromSQLEx Plik STDIN: 00026050 1385 04AC __fastcall Dbcommon :: GetTableNameFromSQLEx (const System :: WideString, Dbcommon :: IDENTIFIEROption) –

+0

Myślę, że to ostatnie ulepszenie. Jestem prawie pewien, że tdump nie zawsze to robił. –

0

z plików źródłowych Delphi 2007:

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

Wydaje się to być ta sama wersja, bo ja też mam ten sam .BPL w moim folderze Windows \ System32.

źródłowy można znaleźć w [Program Files foldery] \ CodeGear \ RAD Studio \ 5.0 \ source \ Win32 \ db

Borland/CodeGear/Embarcadero użył tego kodowania na chwilę teraz i nigdy nie dał wiele szczegółów na temat w formacie .BPL. Nigdy ich nie interesowałem, ponieważ nie lubię używać bibliotek uruchomieniowych w swoich projektach. Wolę je kompilować do moich projektów, choć spowoduje to znacznie większe pliki wykonywalne.

+0

Właściwie to wiem, który to jest: Delphi 2007 aktualizacja 3, DBCommon. To było bardziej przeznaczone dla BPL, dla których nie masz źródeł, lub potrzebujesz polować na źródła. Przeformułowałem moje pytanie. Przepraszamy za niedogodności :-) –

7

Zobacz także this article (w języku niemieckim). Domyślam się, że układanie jest zapewne zgodne z poprzednimi wersjami, a nowe schematy makrowania są wprowadzane w późniejszych wersjach Delphi dla nowych funkcji językowych.

+0

Dzięki. Czytam po niemiecku, więc nie stanowi to problemu. Teraz chcę zaakceptować dwie odpowiedzi :-) –

6

Jeśli posiadasz C++ Builder, sprawdź $ (BDS) \ źródło \ cpprtl \ Source \ misc \ unmangle.c - zawiera kod źródłowy mechanizmu unmangling używanego przez TDUMP, debugger i linker. (C++ Builder i Delphi używają tego samego schematu mangling.)

+1

Briljant! Od kiedy to zostało wprowadzone? Wygląda na to, że mam tylko wersje 2009 i 2010: D2009-Enterprise \ source \ cpprtl \ Source \ misc \ unmangle.c D2010-Enterprise \ source \ cpprtl \ Source \ misc \ unmangle.c Dobry materiał do czytania: -) –

+2

Myślę, że to było tak długo jak samo BCC. Jednak plik został nazwany um.c zamiast unmangle.c w starszych wersjach. –

Powiązane problemy