Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Kurzes Delphiprogramm in dll umwandeln. (https://www.delphipraxis.net/101448-kurzes-delphiprogramm-dll-umwandeln.html)

Explorer 13. Okt 2007 14:04


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.

mkinzler 13. Okt 2007 14:06

Re: Kurzes Delphiprogramm in dll umwandeln.
 
Unit in ein Dll-Projekt einbinden und gewünschte Funktion(en) exportieren.

Explorer 13. Okt 2007 16:12

Re: Kurzes Delphiprogramm in dll umwandeln.
 
Zitat:

Zitat von mkinzler
Unit in ein Dll-Projekt einbinden und gewünschte Funktion(en) exportieren.

-Unit ist ! bereits in eine lib eingebunden und - leicht aus dem code ersichtlich - auch bereits exportiert.

Das Problem ist, dass ich über GetUserName keinen Wert zurück geliefert erhalte.

Luckie 13. Okt 2007 16:47

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: http://www.michael-puff.de/Artikel/2...ring_DLL.shtml

Bernhard Geyer 13. Okt 2007 16:57

Re: Kurzes Delphiprogramm in dll umwandeln.
 
Das Problem wird der Aufruf der GetuserName-Funktion in der Win-API sein.
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.

Explorer 13. Okt 2007 18:28

Re: Kurzes Delphiprogramm in dll umwandeln.
 
Zitat:

Zitat von Luckie
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: http://www.michael-puff.de/Artikel/2...ring_DLL.shtml

Das Interface meiner Datenbank nimmt nur PWideChar entgegen.

Explorer 13. Okt 2007 18:30

Re: Kurzes Delphiprogramm in dll umwandeln.
 
Zitat:

Zitat von Bernhard Geyer
Das Problem wird der Aufruf der GetuserName-Funktion in der Win-API sein.
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.

Genau das ist scheinbar das tatsächliche Problem. GetUserName liefert eben keinen String zurück.

Luckie 13. Okt 2007 18:44

Re: Kurzes Delphiprogramm in dll umwandeln.
 
Dann lies dir mal durch, was in meinem verlinktem Artikel steht.

Explorer 14. Okt 2007 10:33

Re: Kurzes Delphiprogramm in dll umwandeln.
 
Zitat:

Zitat von Luckie
Dann lies dir mal durch, was in meinem verlinktem Artikel steht.

Ich bringe das Problem auf den Punkt: ich benötige einen Zugriff auf die GetUserName-Funktion in der Windows.pas, weiss indes nicht, wie dies zu bewerkstelligen ist.

näheres unter: http://www.delphi-forum.de/topic_Kur...eln_77313.html

Gruß
Explorer

Bernhard Geyer 14. Okt 2007 11:19

Re: Kurzes Delphiprogramm in dll umwandeln.
 
Zitat:

Zitat von Explorer
Zitat:

Zitat von Luckie
Dann lies dir mal durch, was in meinem verlinktem Artikel steht.

Ich bringe das Problem auf den Punkt: ich benötige einen Zugriff auf die GetUserName-Funktion in der Windows.pas, weiss indes nicht, wie dies zu bewerkstelligen ist.

Lesen ist angesagt. Einerseits hat Luckie dich auf ein Tutorial hingewiesen das mit Sicherheit die üblichen Fehler bei Verwendung von P(Wide)Chars auflistet und andererseits habe ich dich genauer auf die Fehler in deinem Code hingewiesen. Wenn du dieses Tutorial nicht lesen willst werden Luckie und ich dir nicht weiter helfen wollen. Und ab es andere noch wollen?

Zitat:

Zitat von Explorer

Bringt keine neuen Infos.


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.

Explorer 15. Okt 2007 15:24

Re: Kurzes Delphiprogramm in dll umwandeln.
 
Zitat:

Zitat von Bernhard Geyer
Zitat:

Zitat von Explorer
Zitat:

Zitat von Luckie
Dann lies dir mal durch, was in meinem verlinktem Artikel steht.

Ich bringe das Problem auf den Punkt: ich benötige einen Zugriff auf die GetUserName-Funktion in der Windows.pas, weiss indes nicht, wie dies zu bewerkstelligen ist.

Lesen ist angesagt. Einerseits hat Luckie dich auf ein Tutorial hingewiesen das mit Sicherheit die üblichen Fehler bei Verwendung von P(Wide)Chars auflistet und andererseits habe ich dich genauer auf die Fehler in deinem Code hingewiesen. Wenn du dieses Tutorial nicht lesen willst werden Luckie und ich dir nicht weiter helfen wollen. Und ab es andere noch wollen?

Zitat:

Zitat von Explorer

Bringt keine neuen Infos.


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.

Problem ist dank eines netten Tippgebers außerhalb dieses Forums gelöst.

Gruß
Explorer

brechi 15. Okt 2007 15:35

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.

rbonk 15. Okt 2007 15:52

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:
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

Bernhard Geyer 15. Okt 2007 16:51

Re: Kurzes Delphiprogramm in dll umwandeln.
 
Zitat:

Zitat von Explorer
Problem ist dank eines netten Tippgebers außerhalb dieses Forums gelöst.

Du meinst den Post von hathor? Ist nichts anderes als was wir dir bisher erklärt haben. Irgendjemand mußt Speicher reservieren und du mußt der Funktion GetUserName auch mitteilen wieviel Platz zur Vefügung steht.

Explorer 16. Okt 2007 12:45

Re: Kurzes Delphiprogramm in dll umwandeln.
 
Zitat:

Zitat von Bernhard Geyer
Zitat:

Zitat von Explorer
Problem ist dank eines netten Tippgebers außerhalb dieses Forums gelöst.

Du meinst den Post von hathor? Ist nichts anderes als was wir dir bisher erklärt haben. Irgendjemand mußt Speicher reservieren und du mußt der Funktion GetUserName auch mitteilen wieviel Platz zur Vefügung steht.

Erfreulicherweise gibt es hin und wieder jene, die in der Lage und willens sind, das Problem anhand eines anschaulichen Beispiels einer schnellen, effizienten Lösung zuzuführen. - Deshalb nochmals Dank an hathor.

Weitere Stellungnahmen hierzu sind für mich nicht mehr von Interesse.

Mit besten Grüßen

Explorer

Luckie 16. Okt 2007 13:01

Re: Kurzes Delphiprogramm in dll umwandeln.
 
Zitat:

Zitat von Explorer
Erfreulicherweise gibt es hin und wieder jene, die in der Lage und willens sind, das Problem anhand eines anschaulichen Beispiels einer schnellen, effizienten Lösung zuzuführen.

Hättest du meinen Link angeklickt und versucht zu verstehen, was ich dort geschrieben habe, dann hättest du die Lösung schon lange gehabt. Natürlich hätte das erfordert, dass du dich damit auseinandersetzt, da ich dort natürlich keine Copy and paste Lösung präsentieren kann, da ich eine allgemeine Lösung aufzeige.

kaiser1401 4. Dez 2007 12:57

Re: Kurzes Delphiprogramm in dll umwandeln.
 
Der Link von Luckie oben ist mittlerweile

http://www.michael-puff.de/Artikel/2...String_DLL.php

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