如题.不用TRY...EXCEPT..END来获得.

解决方案 »

  1.   

    得到dll函数列表
    function GetProcList(DllFileName: String): String;
    var
      DataDirectory: TImageDataDirectory;
      P1: ^Cardinal;
      Base, NumberOfNames, AddressOfNames, i: Cardinal;
      NameList: TStrings;
      hModule: Cardinal;
    begin
      hModule := LoadLibrary(PChar(DllFileName));
      NameList := TStringList.Create;
      try 
        DataDirectory :=
          PImageNtHeaders(Cardinal(hModule) +
            Cardinal(PImageDosHeader(hModule)^._lfanew))^.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT];
        P1 := Pointer(hModule + DataDirectory.VirtualAddress + 16);
        Base := P1^; //输出函数的起始序号。一般为1。
        P1 := Pointer(hModule + DataDirectory.VirtualAddress + 24);
        NumberOfNames := P1^;//输出函数名的指针的数组中的元素个数。
        P1 := Pointer(hModule + DataDirectory.VirtualAddress + 32);
        AddressOfNames := P1^; //一个RVA,指向输出函数名的指针的数组。
        begin
          //lpProcName参数指向函数名
          for i := Base to NumberOfNames + Base - 1 do
          begin
            //按顺序在输出函数名中找
            P1 := Pointer(hModule + AddressOfNames + (i - 1) * 4);
            NameList.Add(PChar(hModule + P1^)); //当前输出函数名
          end;
        end;
      finally
        FreeLibrary(hModule);
        Result := NameList.DelimitedText;
      end; 
    end;
      

  2.   

    上面的方法有内存泄漏,修改如下,不好意思:)function GetProcList(DllFileName: String): String;
    var
      DataDirectory: TImageDataDirectory;
      P1: ^Cardinal;
      Base, NumberOfNames, AddressOfNames, i: Cardinal;
      NameList: TStrings;
      hModule: Cardinal;
    begin
      hModule := LoadLibrary(PChar(DllFileName));
      NameList := TStringList.Create;
      try 
        DataDirectory :=
          PImageNtHeaders(Cardinal(hModule) +
            Cardinal(PImageDosHeader(hModule)^._lfanew))^.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT];
        P1 := Pointer(hModule + DataDirectory.VirtualAddress + 16);
        Base := P1^; //输出函数的起始序号。一般为1。
        P1 := Pointer(hModule + DataDirectory.VirtualAddress + 24);
        NumberOfNames := P1^;//输出函数名的指针的数组中的元素个数。
        P1 := Pointer(hModule + DataDirectory.VirtualAddress + 32);
        AddressOfNames := P1^; //一个RVA,指向输出函数名的指针的数组。
        begin
          //lpProcName参数指向函数名
          for i := Base to NumberOfNames + Base - 1 do
          begin
            //按顺序在输出函数名中找
            P1 := Pointer(hModule + AddressOfNames + (i - 1) * 4);
            NameList.Add(PChar(hModule + P1^)); //当前输出函数名
          end;
        end;
        Result := NameList.DelimitedText;
      finally
        FreeLibrary(hModule);
        NameList.Free;
      end;
    end;