Einzelnen Beitrag anzeigen

Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.116 Beiträge
 
Delphi 11 Alexandria
 
#34
  Alt 23. Jan 2003, 14:23
Moin Chris,

nein, ich meine Damit, dass Du einen Typ deklarierst, der der Funktionsdeklaration entspricht, dann eine Variable diese Typs, die entsprechende DLL aus der die Funktion stammt mittels LoadLibrary/LoadLibraryEx lädst, und dann die Adresse der Funktion mit GetProcAddress der Variablen zuweist.
NetUserEnum (und die Netapi32.dll) gibt's auf der 9x Schiene nicht, so dass bei statischem Import das Programm beim Starten sonst gleich mit einer Fehlermeldung abbricht, wenn die, statisch importierte, Funktion irgendwo angesprochen wird.

So könnte das Ganze dann mit dynamischem Import der Funktionen aussehen:

Delphi-Quellcode:
const
  MAX_PREFERRED_LENGTH = DWORD(-1);
  FILTER_NORMAL_ACCOUNT = $0002;
  NERR_Success = 0;

type
  NET_API_STATUS = DWORD;

  TcsNetUserEnum = function(
    const servername : PWChar;
    const level : DWord;
    const filter : DWord;
    const bufptr : Pointer;
    const prefmaxlen : DWord;
    const entriesread : PDWord;
    const totalentries : PDWord;
    const resume_handle : PDWord
    ) : NET_API_STATUS; stdcall;

  TcsNetApiBufferFree = function(
    const Buffer : Pointer
    ) : NET_API_STATUS; stdcall;

  PUSER_INFO_0 = ^USER_INFO_0;
  USER_INFO_0 =
    packed record
      usri0_name : PWChar;
    end;

var
  NetUserEnum : TcsNetUserEnum;
  NetApiBufferFree : TcsNetApiBufferFree;
  hDLL : DWORD;

  pBuffer : PUSER_INFO_0;
  pWork : PUSER_INFO_0;
  dwEntriesRead : DWORD;
  dwTotalEntries : DWORD;
  i : integer;

begin
  hDLL := LoadLibrary('netapi32.dll');
  if hDLL = 0 then
  begin
    exit;
  end;
  try
    NetUserEnum := GetProcAddress(hDLL,'NetUserEnum');
    if @NetUserEnum = nil then
    begin
      exit;
    end;
    NetApiBufferFree := GetProcAddress(hDLL,'NetApiBufferFree');
    if @NetApiBufferFree = nil then
    begin
      exit;
    end;
    // Nutzen der Funktion
    if NetUserEnum(nil,0,FILTER_NORMAL_ACCOUNT,@pBuffer,MAX_PREFERRED_LENGTH,@dwEntriesRead,@dwTotalEntries,nil) = NERR_Success then
    begin
      try
        ListBox1.Items.Clear;
        pWork := pBuffer;
        for i := 1 to dwEntriesRead do
        begin
          ListBox1.Items.Add(pWork.usri0_name);
          inc(pWork);
        end;
      finally
        NetApiBufferFree(pBuffer);
      end;
    end;
  finally
    FreeLibrary(hDLL);
  end;
end;
Wobei man natürlich den Import, bzw. Freigabe der DLL auch im initialization/finalization Abschnitt erledigen kann (sollte), und das dann in Abhängigkeit des Betriebssystemes, auf dem das Programm läuft.
Was, gerade bei den Netxxx Funktionen, oft eine Beschränkung bedeutet, da nicht alle dieser Funktionen unter 9x zur Verfügung stehen. (z.B. NetUserEnum)

Für 9x muss man sich dann ggf. noch eine Unterscheidung der Datenstrukturen einfallen lassen, da die MS Deklarationen sich nur in der Gross-/Kleinschreibung unterscheiden, was in Pascal ja nicht funktioniert.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat