Delphi-PRAXiS
Seite 1 von 4  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Software-Projekte der Mitglieder (https://www.delphipraxis.net/26-software-projekte-der-mitglieder/)
-   -   DLLExports (https://www.delphipraxis.net/3947-dllexports.html)

Luckie 8. Apr 2003 01:11


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

Daniel 8. Apr 2003 07:54

Hallo Luckie,

das Programm gefällt mir, allerdings habe ich noch ein paar Wünsche. *g* Also:
  • Ich will ... nein ... ich wünsche mir..., dass ich das Fenster in seiner Größe verändern kann.
  • Ich fände es angenehmer, wenn beim Klick auf eine Zeile nicht nur die erste Spalte markiert wird. Die Informationen einer Zeile hängen zusammen und spaltenweise zu selektieren, macht aus meiner Sicht wenig Sinn.
  • Kannst Du nicht jetzt auf Knopfdruck das Delphi-Grundgerüst für eine Import-Unit generieren, in der alle (selektierten?) Funktionen aufgelistet sind. Man müsste dann nur noch per Hand die Parameterlisten einfügen.
  • Ich würde den Funktionsnamen in der aktuell selektierten Zeile gerne per Doppelklick in die Zwischenablage befördern können.

Luckie 8. Apr 2003 08:33

Na der ein oder andere Wunsch wird sich erfüllen lassen. Nur die Schokolade werde ich nicht liefern können - online.

MathiasSimmack 8. Apr 2003 09:07

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:
ofn.lStructSize := sizeof(TOpenFileName);
ersetzt, dann ging´s. Das Problem trat sowohl unter 98 als auch unter XP auf.

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:
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;
// <---

{...}
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.

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:
pFunctionRVAs := ImageRvaToVa(imageinfo.FileHeader, imageinfo.MappedAddress,
  DWORD(pExportDirectory^.AddressOfFunctions), pDummy);
pOrdinals    := ImageRvaToVa(imageinfo.FileHeader, imageinfo.MappedAddress,
  DWORD(pExportDirectory^.AddressOfNameOrdinals), pDummy);
Tatsächlich muss ich beides auskommentieren und in der Schleife durch 0/nil ersetzen:
Delphi-Quellcode:
FOrdinals[i] := 0; //pOrdinals^[i];
FAddresses[i] := nil; // Pointer(pFunctionRVAs^[FOrdinals[i]]);
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.

Du hast uns da doch wohl nicht etwas eine "kaputte" Version des Quälcodes angedreht. :wink:

Gruß.

Luckie 8. Apr 2003 09:32

Zitat:

Zitat von MathiasSimmack
Ich habe da auch noch was:

Wie zu erwarten. :mrgreen:
Zitat:

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.
:x Hast du eine Lösung parat?
Zitat:

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:
ofn.lStructSize := sizeof(TOpenFileName);
ersetzt, dann ging´s. Das Problem trat sowohl unter 98 als auch unter XP auf.
Klappt es dann auch unter 98? Ich denke da gab es mal Probleme, deswegen habe ich das so gemacht. Ich habe D6 Personal, du arbeitets mit D5 oder?
Zitat:

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.
Vergesse ich immer wieder. :roll:
Zitat:

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.
Das wäre eventuell sinnvoll.
Zitat:

5. Noch ein Problem in der for-Schleife der Prozedur "TDllInfo.DumpExportDirectories":
Delphi-Quellcode:
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;
// <---
{...}
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.
Da fehlt wohl ein begin und end bei dem else. :roll:
Zitat:

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:
pFunctionRVAs := ImageRvaToVa(imageinfo.FileHeader, imageinfo.MappedAddress,
  DWORD(pExportDirectory^.AddressOfFunctions), pDummy);
pOrdinals    := ImageRvaToVa(imageinfo.FileHeader, imageinfo.MappedAddress,
  DWORD(pExportDirectory^.AddressOfNameOrdinals), pDummy);
Tatsächlich muss ich beides auskommentieren und in der Schleife durch 0/nil ersetzen:
Delphi-Quellcode:
FOrdinals[i] := 0; //pOrdinals^[i];
FAddresses[i] := nil; // Pointer(pFunctionRVAs^[FOrdinals[i]]);
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.
Hm. :(
Zitat:

Du hast uns da doch wohl nicht etwas eine "kaputte" Version des Quälcodes angedreht. :wink:
Wenn dann umgekehrt. Quellcode ist aktueller als die Exe. :oops:

Darty 8. Apr 2003 10:32

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

Luckie 8. Apr 2003 10:39

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.

MathiasSimmack 8. Apr 2003 11:10

Zitat:

Zitat von Luckie
Hast du eine Lösung parat?

Na ja, die Adresse als Integer casten und dann einfach nur hexadezimal (8stellig) formatieren. Ich hoffe, das ist richtig so:
Delphi-Quellcode:
s := Format('%.8X', [integer(DLLInfo.FuncAddresses[i])]);
Anzeigen würde es was, aber ob das nun auch die Adresse ist ...

Zitat:

Klappt es dann auch unter 98? Ich denke da gab es mal Probleme, deswegen habe ich das so gemacht. Ich habe D6 Personal, du arbeitets mit D5 oder?
Ja. Und: Ja.

Zitat:

Da fehlt wohl ein begin und end bei dem else.
Eigentlich würde es genügen, die von mir als "Fehler" markierte Zeile zu entfernen. Aber das hast du inzwischen wohl schon getan.

Zitat:

Zitat:

Zitat von MathiasSimmack
Ich habe da auch noch was:

Wie zu erwarten. :mrgreen:
Da fällt mir doch glatt noch ein, dass Balloon-Tooltipps nur in der TNA richtig gut aussehen ... :wink:

Luckie 8. Apr 2003 11:37

Es sind die Adressen.

FTP geht immer noch nicht.

MathiasSimmack 8. Apr 2003 12:18

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 17:19 Uhr.
Seite 1 von 4  1 23     Letzte »    

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz