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.