20. maj 2002 - 15:44Der er
7 kommentarer og 1 løsning
DLL Tester
Jeg er ved at lave nogle DLL'er, og for at finde ud af om de virker, vil jeg kode en DLL-tester, hvor jeg simpelthen loader DLL'en og derefter skal jeg ahve en liste over funtioner og procedure, samt parametre som skal overføres - hvorefter jeg så kan tester de forskellige funktioner...
Pt. loader jeg mine DLL'er dynamisk, via noget der ligner dette:
Type TProcedure1 = procedure(et-eller-andet); TFunction1 = function: Boolean;
var Procedure1: TProcedure1; Function1: TFunction1;
DLLHandle := LoadLibrary(PChar(Minfil)); if DLLHandle <> 0 then begin @Procedure1 := GetProcAddress(DLLHandle,'EnProcedure'); @Function1 := GetProcAddress(DLLHandle,'EnFunction'); end;
uses Forms, Classes, SysUtils, Dialogs, ImageHlp, // routines to access debug information Windows;
type TForm1 = class(TForm)
private { Private declarations } public { Public declarations } end;
var Form1: TForm1;
implementation
{$R *.DFM}
// by Dmitry Streblechenko procedure ListDLLFunctions(DLLName: String; List: TStrings); type chararr = array [0..$FFFFFF] of Char; var H: THandle; I, fc: integer; st: string; arr: Pointer; ImageDebugInformation: PImageDebugInformation; begin List.Clear; DLLName := ExpandFileName(DLLName); if FileExists(DLLName) then begin H := CreateFile(PChar(DLLName), GENERIC_READ, FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); if H<>INVALID_HANDLE_VALUE then try ImageDebugInformation := MapDebugInformation(H, PChar(DLLName), nil, 0); if ImageDebugInformation<>nil then try arr := ImageDebugInformation^.ExportedNames; fc := 0; for I := 0 to ImageDebugInformation^.ExportedNamesSize - 1 do if chararr(arr^)[I]=#0 then begin st := PChar(@chararr(arr^)[fc]); if Length(st)>0 then List.Add(st); if (I>0) and (chararr(arr^)[I-1]=#0) then Break; fc := I + 1 end finally UnmapDebugInformation(ImageDebugInformation) end finally CloseHandle(H) end end end;
// the following is an example how to use the procedure
var List: TStrings; I: integer; S: String;
begin List := TStringList.Create;
ListDLLFunctions('c:\cjpexplorerv11\expreg.dll', List); showmessage(inttostr(list.count)); S := 'List of functions'; for I := 0 to List.Count - 1 do S := S + #13#10 + List[I]; ShowMessage(S);
List.Free end.
Skulle kunne gøre det, men jeg har nu aldrig hørt om nogen der har fået det til at virke - men prøv
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.