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

  • 相关阅读:
    js,JavaScript,a标签onclick传递参数不对,A标签调用js函数写法总结
    Java两大测试方法Junit和TestNG的比较
    java简单的测试方法执行了多少时间
    利用Chrome的Performance工具排查页面性能问题(原叫timeline)
    P3317 [SDOI2014]重建(Matrix-tree+期望)
    P2221 [HAOI2012]高速公路(线段树)
    P2473 [SCOI2008]奖励关(期望)
    P3302 [SDOI2013]森林(主席树+启发式合并)
    bzoj3932 / P3168 [CQOI2015]任务查询系统(主席树+差分)
    P2219 [HAOI2007]修筑绿化带(单调队列)
  • 原文地址:https://www.cnblogs.com/findumars/p/7230718.html
Copyright © 2011-2022 走看看