Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 如何在DLL中获取所有导出的函数?_Delphi_Delphi Xe7 - Fatal编程技术网

Delphi 如何在DLL中获取所有导出的函数?

Delphi 如何在DLL中获取所有导出的函数?,delphi,delphi-xe7,Delphi,Delphi Xe7,如何以编程方式从DLL获取所有导出的函数?我正在尝试比较导出函数的两个DLL。这是我使用的代码: uses System.Classes, Winapi.Windows; type PIMAGE_NT_HEADERS = ^IMAGE_NT_HEADERS; PIMAGE_EXPORT_DIRECTORY = ^IMAGE_EXPORT_DIRECTORY; function ImageNtHeader(Base: Pointer): PIMAGE_NT_HEADERS; std

如何以编程方式从DLL获取所有导出的函数?我正在尝试比较导出函数的两个DLL。

这是我使用的代码:

uses
  System.Classes, Winapi.Windows;

type
  PIMAGE_NT_HEADERS = ^IMAGE_NT_HEADERS;
  PIMAGE_EXPORT_DIRECTORY = ^IMAGE_EXPORT_DIRECTORY;

function ImageNtHeader(Base: Pointer): PIMAGE_NT_HEADERS; stdcall; external 'dbghelp.dll';
function ImageRvaToVa(NtHeaders: Pointer; Base: Pointer; Rva: ULONG; LastRvaSection: Pointer): Pointer; stdcall; external 'dbghelp.dll';

procedure EnumerateImageExportedFunctionNames(const ImageName: string; NamesList: TStrings);
var
  i: Integer;
  FileHandle: THandle;
  ImageHandle: THandle;
  ImagePointer: Pointer;
  Header: PIMAGE_NT_HEADERS;
  ExportTable: PIMAGE_EXPORT_DIRECTORY;
  NamesPointer: Pointer;
  NamesPtr: PCardinal;
  NamePtr: PAnsiChar;
begin
  //NOTE: our policy in this procedure is to exit upon any failure and return and empty list

  NamesList.Clear;

  FileHandle := CreateFile(
    PChar(ImageName),
    GENERIC_READ,
    FILE_SHARE_READ,
    nil,
    OPEN_EXISTING,
    FILE_ATTRIBUTE_NORMAL,
    0
  );
  if FileHandle=INVALID_HANDLE_VALUE then begin
    exit;
  end;
  Try
    ImageHandle := CreateFileMapping(FileHandle, nil, PAGE_READONLY, 0, 0, nil);
    if ImageHandle=0 then begin
      exit;
    end;
    Try
      ImagePointer := MapViewOfFile(ImageHandle, FILE_MAP_READ, 0, 0, 0);
      if not Assigned(ImagePointer) then begin
        exit;
      end;

      Try
        Header := ImageNtHeader(ImagePointer);
        if not Assigned(Header) then begin
          exit;
        end;
        if Header.Signature<>$00004550 then begin // "PE\0\0" as a DWORD.
          exit;
        end;

        ExportTable := ImageRvaToVa(Header, ImagePointer, Header.OptionalHeader.DataDirectory[0].VirtualAddress, nil);
        if not Assigned(ExportTable) then begin
          exit;
        end;

        NamesPtr := ImageRvaToVa(Header, ImagePointer, Cardinal(ExportTable.AddressOfNames), nil);
        if not Assigned(NamesPtr) then begin
          exit;
        end;

        for i := 0 to ExportTable.NumberOfNames-1 do begin
          NamePtr := ImageRvaToVa(Header, ImagePointer, NamesPtr^, nil);
          if not Assigned(NamePtr) then begin
            exit;
          end;

          NamesList.Add(NamePtr);
          inc(NamesPtr);
        end;
      Finally
        UnmapViewOfFile(ImagePointer); // Ignore error as there is not much we could do.
      End;
    Finally
      CloseHandle(ImageHandle);
    End;
  Finally
    CloseHandle(FileHandle);
  End;
end;
使用
类,Winapi.Windows;
类型
PIMAGE\u NT\u头文件=^IMAGE\u NT\u头文件;
PIMAGE_EXPORT_DIRECTORY=^IMAGE_EXPORT_DIRECTORY;
函数ImageNtHeader(基:指针):PIMAGE\u NT\u头;stdcall;外部“dbghelp.dll”;
函数ImageRvaToVa(n头:指针;基:指针;Rva:ULONG;lastRVA节:指针):指针;stdcall;外部“dbghelp.dll”;
过程EnumerateImageExportedFunctionNames(常量ImageName:string;名称列表:tString);
变量
i:整数;
文件句柄:THandle;
图像句柄:THandle;
ImagePointer:指针;
标题:PIMAGE\u NT\u标题;
ExportTable:PIMAGE\u EXPORT\u目录;
名称指针:指针;
名称:PCardinal;
姓名:潘斯卡尔;
开始
//注意:本程序中的策略是在出现任何故障时退出,并返回空列表
名称列表。清除;
FileHandle:=CreateFile(
PChar(图像名称),
泛读,
文件共享读取,
无
开放式,
文件\u属性\u正常,
0
);
如果FileHandle=无效的\u HANDLE\u值,则开始
出口
结束;
尝试
ImageHandle:=CreateFileMapping(FileHandle,nil,PAGE_READONLY,0,0,nil);
如果ImageHandle=0,则开始
出口
结束;
尝试
ImagePointer:=MapViewOfFile(ImageHandle,文件\映射\读取,0,0,0);
如果未分配(ImagePointer),则开始
出口
结束;
尝试
标头:=ImageNtHeader(ImagePointer);
如果未分配(标题),则开始
出口
结束;
如果Header.Signature$00004550,则以DWORD开头//“PE\0\0”。
出口
结束;
ExportTable:=ImageRvaToVa(头,ImagePointer,头.OptionalHeader.DataDirectory[0].VirtualAddress,无);
如果未分配(ExportTable),则开始
出口
结束;
NamesPtr:=ImageRvaToVa(头,ImagePointer,基数(ExportTable.AddressOfNames),nil);
如果未分配(名称PTR),则开始
出口
结束;
对于i:=0的ExportTable.NumberOfNames-1不开始
NamePtr:=ImageRvaToVa(头,ImagePointer,NamePtr^,nil);
如果未分配(名称PTR),则开始
出口
结束;
NamesList.Add(NamePtr);
股份有限公司;
结束;
最后
取消设置文件(图像指针);//忽略错误,因为我们无能为力。
结束;
最后
闭合手柄(图像手柄);
结束;
最后
CloseHandle(FileHandle);
结束;
结束;

我来这里是想找到一种方法,列出ocx(基本上是一个dll)中包含的所有函数。这里的所有信息都没有告诉我我在找什么。但是后来我从nirsoft()找到了免费的dllexp.exe


直接下载链接:它完美地显示了dll/ocx的所有导出功能,并且非常方便用户。

@DavidHeffernan当然是以编程方式。如果您需要在控制台中执行此操作:
tdump.exe YourDLL.dll
,然后在
WinMerge
或任何其他文本比较工具中进行比较,您可以在中查看代码GExperts PE Information Expert,它显示所有标题以及dll的导入和导出。