hehe, jedesmal wenn du Änderungen machst, hast du etwas geändert, was niemand gewollt hat.
Ich sehe, dass du keine Ahnung von Pointern hast und eigentlich nur ausprobierst. Such dir mal (oder frage im Forum) Tutorials
über Pointerarithmetik.
Hier verwendest du plötzlich einen untypisierten Pointer. KA warum.
Delphi-Quellcode:
parmerr : LPDWORD;
wComment: WideString;
wGroupName: WideString;
nerr: Cardinal;
begin
wComment := Edit2.Text;
wGroupName := Edit1.Text;
parmerr := nil;
GetMem(info,sizeOf(PLOCALGROUP_INFO_1));
Das GetMem ist falsch. Mit "sizeOf(PLOCALGROUP_INFO_1)" bekommst du die Größe des Zeigers und nicht die der Struktur. Auf 32Bit Systemen kommt immer 4 raus.
Es sollte also LOCALGROUP_INFO_1 sein, für das 8 rauskommt.
Zudem erstellst du Speicher für Info, jedoch nicht "parmerr" was ja auch ein Pointer ist (LP... -> Long Pointer).
Delphi-Quellcode:
PLOCALGROUP_INFO_1(info)^.lgrpi1_comment := PWideChar(wComment);
PLOCALGROUP_INFO_1(info)^.lgrpi1_name := PWideChar(wGroupName);
nerr := NetLocalGroupAdd(PWideChar('.'), 1, @info, parmerr);
Hier übergibst du per @-Operator einen Zeiger an die Funktion. Das bedeutet du übergibst die Speicheraddresse des Zeigers an die Funktion.Sozusagen ein Zeiger auf einen Zeiger.
Resultat: Buffer Overflow (Zugriffsverletzung im besten Fall).
Ich hab dir schon geschrieben (was du nicht gelesen oder nicht verstanden hast), dass man einfach LOCALGROUP_INFO_1 als Variablentyp nimmt und kein GetMem verwendet,
dafür die Variable mit @ der
API-Funktion übergibt.
Oder, dass man PLOCALGROUP_INFO_1 mit GetMem verwendet und dafür @ nicht verwendet.
Dasselbe gilt für "parmerr".
Hättest du keinen untypisierten Zeiger für "info" verwendet, dann müsstest du kein Type-Cast machen.
Ich lege dir dringend nahe, dass du dich mit Zeigern beschäftigen solltest, bevor du weitermachst.