![]() |
Kurzes Delphiprogramm in dll umwandeln.
Hallo Forum,
habe mir ein kleines Programm geschrieben, welches den Usernamen ausliest. Möchte nun dasselbige in eine dll umschreiben, was mir einfach nicht gelingen mag. Was mache ich falsch ? Über einen konstruktiven Tipp wäre ich dankbar. Mit besten Grüßen Explorer ---------Prog--------------
Delphi-Quellcode:
unit user_ermitteln;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls; procedure ErmittleUser(MyWideString: PWideChar); stdcall; export; implementation procedure ErmittleUser(MyWideString: PWideChar); stdcall; export; var User_angemeldet: String; UserName: String; UserNameLen: DWord; StringLaenge :Integer; begin If GetUserName(PChar(UserName), UserNameLen) Then begin User_angemeldet := Copy(UserName,1,UserNameLen - 1); StringLaenge := Length(User_angemeldet)+1 ; StringToWideChar(User_angemeldet, MyWideString, StringLaenge); ShowMessage(User_angemeldet); end else StringLaenge := Length('unbekannt')+1 ; StringToWideChar('unbekannt', MyWideString, StringLaenge) end; end. |
Re: Kurzes Delphiprogramm in dll umwandeln.
Unit in ein Dll-Projekt einbinden und gewünschte Funktion(en) exportieren.
|
Re: Kurzes Delphiprogramm in dll umwandeln.
Zitat:
Das Problem ist, dass ich über GetUserName keinen Wert zurück geliefert erhalte. |
Re: Kurzes Delphiprogramm in dll umwandeln.
Wie rufst du sie denn auf? Und warum ist das Argument ein PWideChar, wenn du in der Funktion nur mit normalen Strings arbeitest?
Und zu Strings und DLLs: ![]() |
Re: Kurzes Delphiprogramm in dll umwandeln.
Das Problem wird der Aufruf der
![]() Mich wundert nur das es nicht kracht. Könnte aber sein weil UserNameLen zufälligerweise immer 0 ist und damit die Funktion weis das sie einen Puffer der Länge 0 hat in den sie den Namen kopieren kann. Und nochwas: Wer sorgt dafür das die Variable MyWideString auch auf einen Speicherbereich zeigt der auch angefordert wurde? Letzendlich ist die Funktion ErmittleUser eine zu 100% sinnlose Funktion wenn man sie in einer DLL mit C-Kompatibler Schnittstelle bereitstellt. |
Re: Kurzes Delphiprogramm in dll umwandeln.
Zitat:
|
Re: Kurzes Delphiprogramm in dll umwandeln.
Zitat:
|
Re: Kurzes Delphiprogramm in dll umwandeln.
Dann lies dir mal durch, was in meinem verlinktem Artikel steht.
|
Re: Kurzes Delphiprogramm in dll umwandeln.
Zitat:
näheres unter: ![]() Gruß Explorer |
Re: Kurzes Delphiprogramm in dll umwandeln.
Zitat:
Zitat:
Wenn du nun eine fertige funktionsfähige Implementierung der verwendung von GetUserName haben willst, schau dir die Funktion GetLocalUserName aus der Unit JclSysInfo der JCL an und verstehe was dort anders gemacht wird. |
Re: Kurzes Delphiprogramm in dll umwandeln.
Zitat:
Gruß Explorer |
Re: Kurzes Delphiprogramm in dll umwandeln.
Würdest du dann auch den Code posten wi es funktioniert? Dann haben andere auch was davon. Bin mal gespannt ob du eine akzeptable Lösung gefunden hast oder das immer noch nicht sauber programmiert ist.
|
Re: Kurzes Delphiprogramm in dll umwandeln.
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:
Sichergestellt sollte dann sein, dass das Programm, das die DLL vewrwendet, nach Aufruf von ErmittleUser() den zurückgelieferten Speicher nur liest !
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.
Delphi-Quellcode:
Gruss,
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. Randolf |
Re: Kurzes Delphiprogramm in dll umwandeln.
Zitat:
|
Re: Kurzes Delphiprogramm in dll umwandeln.
Zitat:
Weitere Stellungnahmen hierzu sind für mich nicht mehr von Interesse. Mit besten Grüßen Explorer |
Re: Kurzes Delphiprogramm in dll umwandeln.
Zitat:
|
Re: Kurzes Delphiprogramm in dll umwandeln.
Der Link von Luckie oben ist mittlerweile
![]() nur damit andere nicht auch noch suchen müssen.... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:59 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz