zoukankan      html  css  js  c++  java
  • delphi获取dll的函数列表

    找了几个,终于找到一个好用的

    function GetDLLFileExports(

      szFileName: PChar;
      mStrings: TStrings
    ): Boolean;
    var
      hFile: THANDLE;
      hFileMapping: THANDLE;
      lpFileBase: Pointer;
      pImg_DOS_Header: PImageDosHeader;
      pImg_NT_Header: PImageNtHeaders;
      pImg_Export_Dir: PImageExportDirectory;
      ppdwNames: ^PDWORD;
      szFunc: PChar;
      i: Integer;
    begin
      Result := False;
      if not Assigned(mStrings) then Exit;
      hFile := CreateFile(szFileName, GENERIC_READ, FILE_SHARE_READ, nil,
        OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
      if(hFile = INVALID_HANDLE_VALUE) then Exit;
      hFileMapping := CreateFileMapping(hFile, nil, PAGE_READONLY, 0, 0, nil);
      if hFileMapping = 0 then
      begin
        CloseHandle(hFile);
        Exit;
      end;

      lpFileBase := MapViewOfFile(hFileMapping, FILE_MAP_READ, 0, 0, 0);
      if lpFileBase = nil then
      begin
        CloseHandle(hFileMapping);
        CloseHandle(hFile);
        Exit;
      end;

      pImg_DOS_Header := PImageDosHeader(lpFileBase);
      pImg_NT_Header := PImageNtHeaders(
        Integer(pImg_DOS_Header) + Integer(pImg_DOS_Header._lfanew));

      if IsBadReadPtr(pImg_NT_Header, SizeOf(IMAGE_NT_HEADERS)) or
        (pImg_NT_Header.Signature <> IMAGE_NT_SIGNATURE) then
      begin
        UnmapViewOfFile(lpFileBase);
        CloseHandle(hFileMapping);
        CloseHandle(hFile);
        Exit;
      end;

      pImg_Export_Dir := PImageExportDirectory(
        pImg_NT_Header.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].
          VirtualAddress);
      if not Assigned(pImg_Export_Dir) then
      begin
        UnmapViewOfFile(lpFileBase);
        CloseHandle(hFileMapping);
        CloseHandle(hFile);
        Exit;
      end;
      // 63 63 72 75 6E 2E 63 6F 6D
      pImg_Export_Dir := PImageExportDirectory(
        ImageRvaToVa(pImg_NT_Header, pImg_DOS_Header, DWORD(pImg_Export_Dir),
        PImageSectionHeader(Pointer(nil)^)));

      ppdwNames := Pointer(pImg_Export_Dir.AddressOfNames);

      ppdwNames := Pointer(ImageRvaToVa(pImg_NT_Header, pImg_DOS_Header,
        DWORD(ppdwNames), PImageSectionHeader(Pointer(nil)^)));
      if not Assigned(ppdwNames) then
      begin
        UnmapViewOfFile(lpFileBase);
        CloseHandle(hFileMapping);
        CloseHandle(hFile);
        Exit;
      end;

      for i := 0 to pImg_Export_Dir.NumberOfNames - 1 do
      begin
        szFunc := PChar(ImageRvaToVa(pImg_NT_Header, pImg_DOS_Header,
          DWORD(ppdwNames^), PImageSectionHeader(Pointer(nil)^)));
        mStrings.Add(szFunc);
        Inc(ppdwNames);
      end;
      UnmapViewOfFile(lpFileBase);
      CloseHandle(hFileMapping);
      CloseHandle(hFile);
      Result := True;

    end;

    //调用示例

    procedure TF_Main.btnTestClick(Sender: TObject);
    begin
      GetDLLFileExports('F:光盘刻录Recliblibrtmp.dll', Memo1.Lines);
    end;

    http://blog.csdn.net/youthon/article/details/7666727

  • 相关阅读:
    loaded some nib but the view outlet was not set
    指标评比
    IOS DEVELOP FOR DUMMIES
    软件测试题二
    javascript select
    DOM节点类型详解
    mysql操作
    UVA 10055
    solutions for 'No Suitable Driver Found For Jdbc'
    解决git中文乱码问题
  • 原文地址:https://www.cnblogs.com/findumars/p/7230718.html
Copyright © 2011-2022 走看看