Einzelnen Beitrag anzeigen

Benutzerbild von RWarnecke
RWarnecke

Registriert seit: 31. Dez 2004
Ort: Stuttgart
4.408 Beiträge
 
Delphi XE8 Enterprise
 
#8

Re: Windows API Übersetzung - Welche Variante ist besser ?

  Alt 6. Nov 2009, 05:44
Zitat von uoeb7gp:
... Variante1 ist statisch, da bekommst wenn was nichgt gefunden wird, böse Fehlermeldungen. ...
Wenn ich bei Variante 1 mit LoadLibrary und GetProcAddress es vorher Abfrage, kann ich doch die ganzen bösen Fehlrmeldungen abfangen. Oder sehe ich das falsch ?

Zitat von uoeb7gp:
Versuchs mal mit folgendem (Types must aus der IPHLPAPI ziehen).

Delphi-Quellcode:
type
  TGetAdapterAdresses = function(Family: ULONG; Flags: cardinal;
    Reserved: PVOID; pAdapterAddresses: PIP_ADAPTER_ADDRESSES;
    pOutBufLen: PULONG) : DWORD; stdcall;

function SafeLoadLibrary(const Filename: String; ErrorMode: UINT): HMODULE;
var
  SaveErrorMode: UINT;
  SaveFPUControlWord: Word;
begin
  SaveErrorMode := SetErrorMode(ErrorMode);
  try
    asm FNSTCW SaveFPUControlWord end;
    try
      Result := LoadLibrary(PChar(Filename));
    finally
      asm
        FNCLEX
        FLDCW SaveFPUControlWord
      end;
    end;
  finally
    SetErrorMode(SaveErrorMode);
  end;
end;


function GetAdapterAdresses(Family: ULONG; Flags: cardinal; Reserved: PVOID;
  pAdapterAddresses: PIP_ADAPTER_ADDRESSES; pOutBufLen: PULONG) : DWORD;
var
  DLLProc: TGetAdapterAdresses;
  DLLHandle: THandle;
begin
  result := 0;
  try
    DLLHandle := SafeLoadLibrary('IPHLPAPI.DLL', SEM_NOOPENFILEERRORBOX);
    if DLLHandle <> 0 then begin
      try
        @DLLProc := GetProcAddress(DLLHandle, 'GetAdapterAdresses');
        if @DLLProc <> nil
          result := DLLProc(Family, Flags, Reserved, pAdapterAddresses, pOutBufLen);
      finally
        FreeLibrary(DLLHandle);
      end;
    end;
  except
    result := DWORD(-1);
  end;
end;
Danke für das Beispiel. Nur verstehe ich noch nicht, warum muss ich jetzt nochmal selber eine Funktion für die API-Funktion schreiben ? Ich wollte ja nur lediglich den Teil mit LoadLibrary und GetProcAddress in eine Funktion setzen.
Rolf Warnecke
App4Mission
  Mit Zitat antworten Zitat