Thema: DLLExports

Einzelnen Beitrag anzeigen

Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#5
  Alt 8. Apr 2003, 09:32
Zitat von MathiasSimmack:
Ich habe da auch noch was:
Wie zu erwarten.
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.
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.
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.
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.
Wenn dann umgekehrt. Quellcode ist aktueller als die Exe.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat