![]() |
DLLExports
Jupp. Mal wieder was neues von mir.
Wie der Name schon vermuten läßt, listet das Programm alle Funktionen auf, die von einer DLL exportiert werden. Wie immer, mit Source und nonVCL. (Der Code für die DLL ist in einer extra Unit und in einer Klasse verpackt, sollte also kein Problem sein sie in eigenen Programmen einzusetzen.) Download: ![]() |
Hallo Luckie,
das Programm gefällt mir, allerdings habe ich noch ein paar Wünsche. *g* Also:
|
Na der ein oder andere Wunsch wird sich erfüllen lassen. Nur die Schokolade werde ich nicht liefern können - online.
|
Ich habe da auch noch was:
1. Allgemein: Die Formatierung "%p" gibt es nur unter Windows 2000 und XP. Ältere Windows-Versionen können damit nichts anfangen. So zeigt Windows 98 bspw. nur ein "p" an. 2. Wenn ich das Programm via Delphi starte, kann ich den Öffnendialog nicht aufrufen. Ich habe mal die Konstante "OPENFILENAME_SIZE_VERSION_400" durch
Code:
ersetzt, dann ging´s. Das Problem trat sowohl unter 98 als auch unter XP auf.
ofn.lStructSize := sizeof(TOpenFileName);
3. In der kompilierten Version erscheinen beim Aufruf des Öffnendialogs unter Win 98 merkwürdige Zeichen im Eingabefeld. Ich habe im Quellcode deshalb vorher mal den "buffer" geleert. 4. In der Prozedur "FillLV" solltest du die List-View erst mal leeren, sonst werden die Funktion einer neuen DLL einfach nur an die bestehende Liste angehangen bzw. in diese eingefügt. Und mit BeginUpdate/EndUpdate ließe sich die Bildschirmausgabe sicher noch etwas beschleunigen. 5. Noch ein Problem in der for-Schleife der Prozedur "TDllInfo.DumpExportDirectories":
Delphi-Quellcode:
Die als "Fehler" markierte Anweisung bewirkt, dass Funktionen ohne eigenen Namen den zuletzt ausgelesenen Namen zugewiesen bekommen. Das kann man bspw. in der "shell32.dll" (XP) sehen, da tauchen etwa in der Hälfte jede Menge WriteCabinetState-Funktionen auf.
for i := 0 to FFuncsCount - 1 do
begin if i < pExportDirectory^.NumberOfNames then begin Name := PChar(ImageRvaToVa(imageinfo.FileHeader, imageinfo.MappedAddress, pNameRVAs^[i], pDummy)); FNames[i] := Name; end else FNames[i] := ''; // -- FEHLER --> FNames[i] := Name; // <--- {...} 6. Erklären kann ich´s (ehrlich gesagt) nicht: wenn ich deinen Quellcode kompiliere und starte, dann sehe ich unter Win 98 bei der Auswahl einer DLL gar nichts. Unter XP erhalte ich eine EAccessViolation-Exception bei diesen beiden Anweisungen:
Delphi-Quellcode:
Tatsächlich muss ich beides auskommentieren und in der Schleife durch 0/nil ersetzen:
pFunctionRVAs := ImageRvaToVa(imageinfo.FileHeader, imageinfo.MappedAddress,
DWORD(pExportDirectory^.AddressOfFunctions), pDummy); pOrdinals := ImageRvaToVa(imageinfo.FileHeader, imageinfo.MappedAddress, DWORD(pExportDirectory^.AddressOfNameOrdinals), pDummy);
Delphi-Quellcode:
dann erhalte ich zumindest die Namen der gefundenen Funktionen (sofern diese einen Namen haben, natürlich). Was ich dabei nicht erklären kann, ist die Tatsache, dass die von dir kompilierte und dem Archiv beiliegende Version des Tools diese Probleme nicht verursacht sondern mir auch die Adressen und Ordinalwerte der Funktionen anzeigt.
FOrdinals[i] := 0; //pOrdinals^[i];
FAddresses[i] := nil; // Pointer(pFunctionRVAs^[FOrdinals[i]]); Du hast uns da doch wohl nicht etwas eine "kaputte" Version des Quälcodes angedreht. :wink: Gruß. |
Zitat:
Zitat:
Zitat:
Zitat:
Zitat:
Zitat:
Zitat:
Zitat:
|
Ist klasse das Teil :)
Wäre es möglich die dazugehörigen Parameter zu bekommen ? Ne Lösung habe ich selber keins parat falls fragst :) |
Bugs gefixt und Wünsche, so weit möglich, entsprochen. Meinem Webhoster ist nur gerade vor 3 Minuten eingefallne, dass sie ein Update machen wollen und aufgrund dessen FTP und alles abgeschaltet haben. :evil: Hochladen ist erst mal nicht. Ich weiß auch nicht wann es wieder geht.
|
Zitat:
Delphi-Quellcode:
Anzeigen würde es was, aber ob das nun auch die Adresse ist ...
s := Format('%.8X', [integer(DLLInfo.FuncAddresses[i])]);
Zitat:
Zitat:
Zitat:
|
Es sind die Adressen.
FTP geht immer noch nicht. |
Noch was: aus der TDllClass-Unit bitte die "SysUtils" entfernen und statt dessen die Format-Routine der "GUITools.inc" benutzen. :) Fällt mir gerade so ein.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:43 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz