WinApi Funktion

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Oskar
Beiträge: 6
Registriert: 28.12.2013 12:39
Computerausstattung: AMD FX 8320, 16 Gb Ram, XFX 7850 Grafikkarte, 2 * HD, eine 32 GB SSD als Cache
Wohnort: Münsterland

WinApi Funktion

Beitrag von Oskar »

Hallo,

ich habe mich mal an eine Windows API Funktion eingelassen.
Ich brauche alle User am lokalen Rechner. Die passende DLL ist "netapi32.dll".
Die passende Funktion heisst "NetUserGetLocalGroups".

Die PRG gibt mir bei Auruf der Funktion den Fehler zurück "Ungültiger Speicherzugriff (Lesefehler an der Adresse 0)
Ich weiss auch in etwa woran es liegt, komme aber einfach nicht weiter.

Es müsste mit der Var. BufPtr zusammenhängen die auf die Funktion PLOCALGROUP_USERS_INFO_0 verweist.

Hier der Code (Ist allerdings noch nicht ganz vollständig)

Code: Alles auswählen

Declare.s NetUserGetLocalGroups()
UsrAllAdmin.s = ""
MessageRequester("", "Alle Admin User: " + NetUserGetLocalGroups(), 0)

Procedure.s NetUserGetLocalGroups()                 ;Anfang Procedure NetUserGetLocalGroups()
DLL = OpenLibrary(#PB_Any, "netapi32.dll")        ;Die DLL "netapi32.dll" fuer Funktionsaufrufe bereitstellen
Protected NUGLG.q
Protected NetApiStatus.i                                       ;Variablen deklarieren
Protected PLGUIA=PLOCALGROUP_USERS_INFO_0
Protected ServerName.u = 0, UserName.u = 0
Protected BufPtr.i = 0
Protected dwLevel.d = 0
Protected dwFlags.d = LG_INCLUDE_INDIRECT
Protected dwPrefMaxLen.d = MAX_PREFERRED_LENGTH
Protected dwEntriesRead.d = 0
Protected dwEntriesTotal.d

If DLL
  NUGLG = GetFunction(DLL, "NetUserGetLocalGroups")
    NetApiStatus = NetUserGetLocalGroups_(ServerName, UserName, dwLevel, dwFlags, BufPtr, PrefMaxLen, @dwEntriesRead, @dwEntriesTotal)
      Else
  MessageRequester("", "Achtung: Funktion nicht bekannt ", 0)
EndIf
CloseLibrary(DLL)
EndProcedure


;NetUserGetLocalGroups netapi32.dll WinApi
;
;
; IN ->  LPWSTR servername,     Pointer to a Unicode string   If this parameter is NULL, the local computer is used
; IN ->  LPWSTR username,       Pointer to a Unicode string
; IN ->  DWORD level,           Level of information required. Only 0 is valid
; IN ->  DWORD flags,           Bitmask of flags. Currently, only LG_INCLUDE_INDIRECT is defined
; OUT <- LPBYTE *bufptr,        On return a pointer,	"LOCALGROUP_USERS_INFO_0"
; IN ->  DWORD prefmaxlen,      Preferred maximum length, in 8-bit bytes of returned data   The preferred maximum length, in bytes, of the returned data	
; OUT <- LPDWORD entriesread,   Pointer to a DWORD that contains the actual enumerated element count
; OUT <- LPDWORD totalentries,  Pointer to a DWORD that contains the total number of entries that could have been enumerated
;
;Return Values
;
;If the function is successful, it returns NERR_SUCCESS.
;If the function fails, the Return value is one of the following error codes
;
;
;
;LOCALGROUP_USERS_INFO_0
;
;Ein Zeiger auf den Puffer, der die Daten empfängt. Das Format dieser Daten hängt vom Wert des Parameters Ebene.
;Dieser Puffer wird vom System reserviert und muss mithilfe der NetApiBufferFree-Funktion freigegeben werden.
;Beachten Sie, dass Sie den Puffer freigeben müssen, auch wenn die Funktion mit ERROR_MORE_DATA schlägt fehl
Ich habe einige Beispiele zu dieser Funktion gefunden, allerdings in C programmiert damit komm ich nicht klar.
Das meiste was Kommentiert ist, ist überwiegend direkt von MSDN.

Ich weis einfach nicht wie ich die Var BufPtr richtig zu dem Funktionsaufruf hinzufüge, bzw so verbinde mit PLOCALGROUP_USERS_INFO_0
Diese Procedure soll auch so bestehen bleiben, ich bin damit angefangen um mich in die WinApi Funktionen einzuarbeiten oder auch üben.

Für Hilfe wäre ich Dankbar

__________________________________________________
Code-Tags hinzugefügt
30.12.2013
RSBasic
Benutzeravatar
Bisonte
Beiträge: 2430
Registriert: 01.04.2007 20:18

Re: WinApi Funktion

Beitrag von Bisonte »

Ohne den Code auszuprobieren... :

Deine Variablendefinitionen sind nicht das, was die Funktion fordert. Ausserdem öffnest du eine DLL, ohne sie zu benutzen.

Die Funktion " NetUserGetLocalGroups_()" wird von PB bereitgestellt. Da brauchst du keine dll öffnen.

Die Variablen, die du an diese Funktion übergibst, sind leider so nicht korrekt.

Ein Auszug aus der MSDN :

Code: Alles auswählen

Syntax :
NET_API_STATUS NetUserGetLocalGroups(
  _In_   LPCWSTR servername,
  _In_   LPCWSTR username,
  _In_   DWORD level,
  _In_   DWORD flags,
  _Out_  LPBYTE *bufptr,
  _In_   DWORD prefmaxlen,
  _Out_  LPDWORD entriesread,
  _Out_  LPDWORD totalentries
);
Ein DWORD ist nicht .d /das wäre Double) sondern ein Long. Also .l
Servername und Username sind nicht .u... es sind Strings. In diesem Falle glaub ich im Unicode Format usw.
Also das dir da ein IMA um die Ohren fliegt ist nur verständlich.
PureBasic 6.10 LTS (Windows x86/x64) | Windows10 Pro x64 | Asus TUF X570 Gaming Plus | R9 5900X | 64GB RAM | GeForce RTX 3080 TI iChill X4 | HAF XF Evo | build by vannicom​​
Antworten