频道分类

Delphi 如何从DLL中检索导出函数的列表

作者:admin 来源: 日期:2020/11/11 14:39:45 人气: 标签:

 
 program Project1;
 
 uses
   Forms,
   Classes,
   SysUtils,
   Dialogs,
   ImageHlp, // routines to access debug information
   Windows;
 
 // 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:\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.