Delphi-PRAXiS

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.

Luckie 8. Apr 2003 12:32

Verdammt, habe mich schon gewundert, warum die Exe so groß ist. :roll: FTP geht immer noch nicht.

Luckie 8. Apr 2003 13:52

Also den Wünschen wurde weitgehen entsprochen und Bugs gefixt (siehe Beitrag von Mathias). Nur leider kann ich im Moment nicht hochladen, da mein Webhoster gerade den FTP abgeschaltet hat (ohne Vorankündigung). :x Also bitte noch etwas gedulden. Ich werde posten, wenn die aktuelle Version zu haben ist.

Darty 8. Apr 2003 14:45

Warum ladest es hier nicht hoch Luckie ?? Falls Problem bis heute Abend besteht kann ich es ja bei mir hosten bis bei Dir wieder alles klar ist ..

mirage228 8. Apr 2003 17:26

Liste der Anhänge anzeigen (Anzahl: 1)
also ich habe noch die erste version und habe die datei "daemon.dll" (von Daemon Tools glaub ich) in meinem Windows Ordner (win XP) geöffnet und bekam das:

(p.S.: du könntest mir die datei doch in icq schicken und ich uppe die auf meinen space)

Luckie 8. Apr 2003 18:45

Also erstmal die gute Nachricht: Die neue version ist oben. Und die schlechte: Dass es bei manchen DLLs abstürzt habe ich noch nicht gelöst. Aber schick doch mal den Problembericht an Microsoft, vielleicht wissen, die ja weiter. :mgreen:

Ich wollte die Kontrolle über die Downloads haben. Das Programm wurde bei mir seit heute Nacht 2:30 schon 23x runtergeladen. So oft wie kein Programm zu vor. Deswegen habe ich es auch nicht hier angehangen oder einen von euch gegeben. Zudem behagt es mir nicht mein Programm auf einen anderen Server zu wissen, den ich nicht kontrollieren kann. Ich habe jetzt neulich erst total veraltete Versionen meiner Programme auf dubiosen Webseiten gefunden.

CalganX 8. Apr 2003 20:21

*argh* Was hast du gemacht? Ich habe es gerade herunterladen wollen (ohne Downloadmanager) und wollte es öffnen. Allerdings scheint es nicht mehr zu sein, als ein Konsolenfenster!!! *sniff* Bitte ändere das schnell!!!

Chris

Luckie 8. Apr 2003 20:32

Ich habe gar nichts gemacht. Das ist ein selbst entpackendes Archiv. Bei mir geht alles: Das Entpacken des Archivs und das Ausführen des Programmes.

Luckie 8. Apr 2003 22:20

Es schien ein paar Probleme mit dem beschädigten Archiv gegeben zu haben. Die sollte nun behoben sein.

Luckie 8. Apr 2003 23:29

So Nico hat den Fehler gefunden, der das Programm bei manchen DLL's hat abstürzen lassen:
Zitat:

PapaNoki (00:26 AM) :
schau mal in den Dependency Walker
PapaNoki (00:26 AM) :
dann haste die Antwort
PapaNoki (00:26 AM) :
die Exporte werden auf andere DLLs durchgeschleift
Luckie (00:27 AM) :
Also die sind gar nicht in der DLL drin?
PapaNoki (00:27 AM) :
jenau
Luckie (00:27 AM) :
Also physikalisch.
PapaNoki (00:27 AM) :
deswegen der Fehler bei der Ermittlung der Funktions adresse
Die gefixte Version ist oben. Alter Link.

Luckie 9. Apr 2003 04:01

So, Nico hat es keine Ruhe gelassen. Version 1.2 ist oben. Jetzt werden auch gemapped Funktionen angezeigt mit der gemapped DLL und dem Funktionsnamen in der gemapped DLL. Sollte jetzt die Final sein.

Download siehe erste Posting.

MathiasSimmack 9. Apr 2003 06:42

Win98. Der Quellcode findet von keiner DLL irgendwelche Funktionen. Und die kompilierte Version zeigt wieder mal nicht den Öffnendialog an, so dass ich erst gar keine DLL auswählen kann. Demzufolge weiß ich auch nicht, ob das Tool letztlich funktionieren würde.

WinXP. Die kompilierte Version funktioniert problemlos. Der Quellcode verursacht nach der Auswahl einer DLL einen Runtime-Error 216 mit der Meldung "Vorgang 'read' konnte ... nicht ausgeführt werden".

Grüße.

Luckie 9. Apr 2003 11:36

Also. Unter 2000 läuft es problemlos. Nico hat es unter XP (SP1a) entwickelt und sollte wohl auch unter diesem OS laufen.
Geändert wurde nur was an der Klasse, der Open-Dialog sollte also auch unter 98 gehen.

MathiasSimmack 9. Apr 2003 13:02

Hm, was soll ich dazu jetzt sagen? Ich hatte keinen Zweifel an euren Fähigkeiten. Ich wollt halt nur vermelden, was bei mir nicht funktioniert.

Luckie 9. Apr 2003 13:10

Tja. Ich weiß es auch nicht. Ich kann nur sagen, dass es unter XP weiterentwickelt wurde und nur an der Klasse was geändert wurde. Jeglicher Source, der den Open-Dialog angeht, blieb unangetastet. Aus dem DF wurde mir betsätigt, dass es unter 2000 keine Probleme zu geben scheint. Daniel hat unter XP auch keine Probleme damit.

Mit welcher DLL hast du es unter XP getestet? wsock32.dll geht, msgina.dll geht, kernel32.dll geht.

Ansonsten muß ich dich auf die beiligenden Sourcen verweisen und wenn es dich interessiert, bzw. ich würde dich mal bitten, es zu debuggen.

MathiasSimmack 9. Apr 2003 13:23

Rätsel gelöst. Was zahlst du? :wink:
Nee, Quatsch. Hier, in der Zeile
Delphi-Quellcode:
Name := PAnsiChar(ImageRvaToVa(Image.FileHeader, Image.MappedAddress,
  Directory.Name, LastRva));
flog das Ding immer raus. Ich habe sie ausgeklammert (wobei mir auffiel, dass "Name" nicht wirklich benutzt wird), und jetzt geht sie unter Windows 98 problemlos. Ich tippe einfach mal ins Blaue, dass es jetzt auch unter XP klappen dürfte.

Luckie 9. Apr 2003 13:34

Hm, das sollte es gewesen sein. Danke.

Es kann jetzt also die neue Version runtergeladen werden.

MathiasSimmack 9. Apr 2003 13:38

btw: Lustiger Bug -> Fenster maximieren und wieder minimieren, und dabei auf das Icon im Banner achten. :)

@Luckie: Kann ich das Ding mal umschreiben? Als Fensterversion? Ich kann mit diesem Dialogzeug nix anfangen. Einmal versehentlich auf ESC gedrückt, und fort ist das Programm.

Luckie 9. Apr 2003 13:45

Argh, da habe ich beim Testen nie hingekuckt.

Hm. Umschreiben? Nur wegen dem Esc? Im Prinzip habe ich nichts dagegen. ist ja Offene Soße.

Luncustaf 24. Jun 2003 14:24

sers luckie,

ich hab versucht mit deinem programm die fmod.dll zu laden ich bekomme aber immer wieder einen efhler - das der befehl read im speicher sowieso nicht ausgeführt werden kann.

kannst du dir das vllt mal anschauen?


gr€€tz

Luckie 24. Jun 2003 16:03

Wenn du mir die datei mal gibts.

Luncustaf 1. Jul 2003 12:35

sers Luckie,

hast du die dll bekommen?


gr€€tz

Luckie 1. Jul 2003 12:37

Ach so ja. Aber ich hatte bisher noch keine Gelegenheit mich drum zu kümmern. Sorry.

Pseudemys Nelsoni 1. Jul 2003 13:30

Liste der Anhänge anzeigen (Anzahl: 1)
moin,

schönes prog luckie. Adde das doch auf http://www.chip.de/feedback/software.html

btw: ich hab die version 1.3, und bekomme einen fehler wenn ich die "nLame DLL"(Lame Codec) öffne, siehe hier:

Pseudemys Nelsoni 1. Jul 2003 13:31

Liste der Anhänge anzeigen (Anzahl: 1)
und nach dem ich auf "Nicht senden" klicke, kommt:

Luckie 1. Jul 2003 13:34

Wird das gleiche Problem, wie bei deinem Kollegen Luncustaf sein.

ich denke nicht, dass das jemanden wirklich interessiert. Es hat ja eigentlich kein Nutzen. Aber für die anderen Programme wäre das interessant. Ich muß nur noch rausfinden, wo ich da das Programm angebe.


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:30 Uhr.

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