2003. december 30., kedd

Retrieve list of exported functions from a DLL


Problem/Question/Abstract:

Retrieve list of exported functions from a DLL

Answer:

To retrieve the list of exported functions from a DLL, pass the DLL name and a TStrings object to the function ListDLLFunctions() shown below.

This does not show the parameters for each export, which you can only get from the author of the DLL.


program Project1;

uses
  Forms,
  Classes,
  SysUtils,
  Dialogs,
  ImageHlp, // routines to access debug information
  Windows;


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:\winnt\system32\mfc42.dll', List);

  S := 'List of functions';
  for I := 0 to List.Count - 1 do
    S := S + #13#10 + List[I];
  ShowMessage(S);
  List.Free
end.

Nincsenek megjegyzések:

Megjegyzés küldése