Einzelnen Beitrag anzeigen

Dezipaitor

Registriert seit: 14. Apr 2003
Ort: Stuttgart
1.701 Beiträge
 
Delphi 7 Professional
 
#5

Re: NetLocalGroupAdd funktioniert nicht

  Alt 30. Sep 2007, 21:42
Zitat von RWarnecke:
Das ist ja auch richtig so, nur ich mache irgendwo noch einen Fehler in der Anwendung. Um es vielleicht besser zu verstehen, wollte ich das ganze selber machen. Denn das hier erworbene Wissen kann ich ja auch auf andere API's anwenden.
Dadurch hast du doppelte Anzahl von Fehlerquellen.
1. Deine Deklaration ist falsch
2. Deine Verwendung ist falsch.
Verwendest du vordefinierte Header, dann hast du nur noch den Fall 2.

Setze mal const in die Parameterliste für die Parameter deiner Funktion.

Außerdem hast du für die Info Variable einen Pointer auf einen Pointer. Mit GetMem allokierst du Speicher für den Pointer. Und dann übergibst du den Pointer nocht mit dem Addressoperator. Entweder du deklarierst die Info-variable auf dem Stack (ohne Pointer!!! also LOCALGROUP_INFO_1) und übergibst sie mit dem Addressoperator (@) --- oder du erstellst die Variable auf dem Heap mit GetMem (PLOCALGROUP_INFO_1) und verwendest dafür kein Addressoperator bei der Funktion. Aber nicht mischen.
Du verwendest eine Ansicode Deklaration der Funktion. Definierst sie aber als Unicode. Dann solltest du sie auch als Unicode laden! Setze ein W ans Ende der Funktion!!!!!
function NetLocalGroupAdd(servername: LPCWSTR; level: DWORD; buf: LPBYTE; parm_err: LPDWORD): NET_API_STATUS; external netapi32 name 'NetLocalGroupAddW';
Deine Deklaration ist falsch.
Delphi-Quellcode:
function NetLocalGroupAdd(servername : PWideChar; level : Integer; buf: PChar;
         parm_err : Integer) : DWORD; stdcall; external 'netapi32.dll';
Laut MSDN für NetLocalGroupAdd ist die Deklaration die folgende:
Code:
NET_API_STATUS NetLocalGroupAdd(
  __in         LPCWSTR servername,
  __in         DWORD level,
  __in         LPBYTE buf,
  __out        LPDWORD parm_err
);
Der Parameter parm_err kann durch den out Typ auch so deklariert werden: "out parm_err : DWORD". Wenn es in/out ist, dann verwenden wir in Delphi "var".


Pass auf welche Datentype du verwendest. Deine Deklaration verwendet für den zweiten und vierten Parameter ein Integer. Jedoch wird ein DWORD (Cardinal) erwartet. Das sind ganz andere Datentypen.


Mein Rat ist, dass du erstmal die vordefinierten WindowsAPI Funktionen verwenden solltest. Wenn das klappt, kannst du immernoch Headerkonvertierung machen. Aber wie du gesehen hast, kann man viel falsch machen. Im schlimmsten Fall funktioniert es in 80% aller Fälle.
Christian
Windows, Tokens, Access Control List, Dateisicherheit, Desktop, Vista Elevation?
Goto: JEDI API LIB & Windows Security Code Library (JWSCL)
  Mit Zitat antworten Zitat