Thema: DLLExports

Einzelnen Beitrag anzeigen

MathiasSimmack
(Gast)

n/a Beiträge
 
#4
  Alt 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.

Gruß.
  Mit Zitat antworten Zitat