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.