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.