![]() |
Moin Chris,
deshalb hatte ich auch meine Deklarationen mit angegeben. In die Jedi Sourcen habe ich noch nicht reingeschaut, deshalb weiss ich nicht, welche "Philosophie" dort vertreten wird, was die Deklaration der APIs angeht. Ich halte mich nur möglichst an die Vorgaben aus dem PSDK, damit ich auch die Samples möglichst einfach nutzen kann. Borland selber deklariert an den Stellen, an denen Werte von der Funktion geschrieben werden sollen die Parameter als var, was dann u.a. zur Folge hat, dass man sich gelegentlich Dummy Variablen anlegen muss, wenn man einen Parameter nicht nutzen will (also auf 0 oder nil setzen muss), was bei einem var Parameter ja nur geht, wenn eine entsprechende Variable angegeben wird. Wichtig: Wenn das Programm auch unter 9x/ME gestartet werden soll, müssen die Funktionen dynamisch importiert werden, und nicht, wie angegeben, statisch, damit sie ggf. weggelassen werden können. |
Was meinst du mit "dynamisch" import? Meinst du Compilerschalter?
Chris |
Zitat:
![]() |
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:
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.
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; 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. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:00 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz