Hallo Explorer,
mir ist auch unklar warum es der Umweg über eine eigene
DLL sein muss und nicht 'advapi32.dll' direkt verwendet werden kann.
Wenns denn sein soll:
Du könntest per Var - Deklaration ausreichend Speicherplatz für den Usernamem in der
DLL reservieren, das erspart sie dynamische Allokation und die Frage wo der Speicher wieder freigegeben wird.
(Windows definiert auch irgendwo die max. Länge des Usernamens, hab nicht gefunden wo, 255 sollte reichen)
Delphi-Quellcode:
library getuser;
uses
Windows;
const
MAX_USERNAME_LEN = 255;
var
BUFFER_USERNAME: Array [0..MAX_USERNAME_LEN] of WideChar;
function ErmittleUser (): PWideChar; stdcall;
var
nSize: Cardinal;
begin
Result := BUFFER_USERNAME;
nSize := MAX_USERNAME_LEN;
if not GetUserNameW (Result, nSize) then
Result := Nil;
end;
exports
ErmittleUser;
begin
end.
Sichergestellt sollte dann sein, dass das Programm, das die
DLL vewrwendet, nach Aufruf von ErmittleUser() den zurückgelieferten Speicher nur liest !
Delphi-Quellcode:
unit f_usedll;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 =
class(TForm)
Button1: TButton;
Label1: TLabel;
procedure Button1Click(Sender: TObject);
private
public
end;
var
Form1: TForm1;
function ErmittleUser (): PWideChar;
stdcall;
external '
getuser.dll'
name '
ErmittleUser';
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var pwUsr: PWideChar;
begin
pwUsr :=
nil;
pwUsr := ErmittleUser();
if pwUsr =
nil then
raise (
Exception.Create('
ErmittleUser() fehlgeschlagen'));
Label1.Caption := pwUsr;
end;
end.
Gruss,
Randolf