Avatar billede timtoolman Nybegynder
20. maj 2002 - 15:44 Der 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;
Avatar billede avlund Nybegynder
20. maj 2002 - 15:50 #1
Det er bare alle tiders. Lyder som et fedt projekt.
Avatar billede dj Nybegynder
20. maj 2002 - 15:54 #2
øhm fint nok, men hvad var problemet ? :)
Avatar billede timtoolman Nybegynder
20. maj 2002 - 15:56 #3
Jeg ville gerne have en ide om hvordan jeg kan lave det..´
Hvordan jeg får lister over procedure og funktioner osv...
Avatar billede dkn Nybegynder
20. maj 2002 - 16:43 #4
unit listfunctionsindll;

interface

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
Avatar billede tormork Nybegynder
20. maj 2002 - 18:49 #5
Så vidt jeg ved kan du ikke få at vide hvilke parametre der skal overføres.
Avatar billede doc404 Novice
20. maj 2002 - 19:06 #6
Du kan ikke få en liste over parametre...Men hvis du selv laver din dll'er så har du vel styr på den del?
Avatar billede timtoolman Nybegynder
20. maj 2002 - 22:33 #7
Det er mine egne DLL'er... :)
Avatar billede tormork Nybegynder
20. maj 2002 - 22:48 #8
ehh så kender du jo også procedure navnene
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester