Autor Beitrag
kisch
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 43

Delphi 7, TDEngine, Linux

BeitragVerfasst: Sa 13.10.07 14:56 
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

Kisch

---------Prog--------------

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
unit user_ermitteln;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls;


procedure ErmittleUser(MyWideString: PWideChar); stdcallexport;


implementation


// Einen String von Delphi via dll an Host-Api übertragen.


procedure ErmittleUser(MyWideString: PWideChar); stdcallexport;

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.



Moderiert von user profile iconjasocul: Topic aus Windows API verschoben am Sa 13.10.2007 um 15:37
Timosch
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 1314

Debian Squeeze, Win 7 Prof.
D7 Pers
BeitragVerfasst: Sa 13.10.07 15:24 
user profile iconkisch hat folgendes geschrieben:

Was mache ich falsch ?

Dazu müssten wir erstmal wissen, was du bis jetzt überhaupt gemacht hast...

Grundsätzlich: Projektquelltext öffnen und "program" durch "library" ersetzen, weiter unten (vorm letzten end.) "exports xyz", wobei xyz der Name der zu exportierenden Prozedur ist. Näheres: dsdt.info/tutorials/dlls/

_________________
If liberty means anything at all, it means the right to tell people what they do not want to hear. - George Orwell
kisch Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 43

Delphi 7, TDEngine, Linux

BeitragVerfasst: Sa 13.10.07 15:48 
user profile iconTimosch hat folgendes geschrieben:
user profile iconkisch hat folgendes geschrieben:

Was mache ich falsch ?

Dazu müssten wir erstmal wissen, was du bis jetzt überhaupt gemacht hast...

Grundsätzlich: Projektquelltext öffnen und "program" durch "library" ersetzen, weiter unten (vorm letzten end.) "exports xyz", wobei xyz der Name der zu exportierenden Prozedur ist. Näheres: dsdt.info/tutorials/dlls/


Hallo Timosch,

lassen wir einmal die tutorial-Fundis beiseite. Die dll läuft problemlos durch, jedoch das Problem ist schlicht und ergreifend, dass ich für "GetUserName" keinen Wert zurück erhalte.
Also: irgendwie fehlt mir der Zugriff auf v.g. function in Windows.pas.

Mit besten Grüßen

Kisch
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Sa 13.10.07 19:01 
Posten wir wieder kreuz und quer in allen Delphi Foren ohne zu verlinken? Eventuell solltest du dich erstmal darum kümmern, was man dir in anderen Foren empfiehlt: www.delphipraxis.net...n+dll+umwandeln.html

Und die DLL-Tutorials würde ich mal nicht beiseite lassen oder weißt du schon alles über DLLs und was es dazu berücksichtigen gibt insbesondere wenn es um Strings geht?
kisch Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 43

Delphi 7, TDEngine, Linux

BeitragVerfasst: Sa 13.10.07 19:29 
user profile iconLuckie hat folgendes geschrieben:
Posten wir wieder kreuz und quer in allen Delphi Foren ohne zu verlinken? Eventuell solltest du dich erstmal darum kümmern, was man dir in anderen Foren empfiehlt: www.delphipraxis.net...n+dll+umwandeln.html

Und die DLL-Tutorials würde ich mal nicht beiseite lassen oder weißt du schon alles über DLLs und was es dazu berücksichtigen gibt insbesondere wenn es um Strings geht?


Das war kein konstruktiver Tipp auf meine klare Anfrage.
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Sa 13.10.07 19:49 
Doch das war sogar sehr konstruktiv, zumindest für die, die dir helfen wollen.
Novo
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 90

Win XP, Win 7
Delphi 7 Enterprise, Delphi 2009
BeitragVerfasst: Sa 13.10.07 19:57 
Warum kann man nicht zu einem bestehenden projekt eine DLL statt eienr Unit erstellen?
Wenn ich Datei -> NEU -> DLL gehe, öffnet sich ein neues Projekt..
So kann man doch net arbeiten, immer hin / her Switchen!
kisch Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 43

Delphi 7, TDEngine, Linux

BeitragVerfasst: Sa 13.10.07 20:01 
user profile iconLuckie hat folgendes geschrieben:
Doch das war sogar sehr konstruktiv, zumindest für die, die dir helfen wollen.


Also wie gesagt: ich bin ausschließlich an einem konstruktiven, konkreten Lösungsansatz interessiert.
JayEff
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2971

Windows Vista Ultimate
D7 Enterprise
BeitragVerfasst: Sa 13.10.07 21:36 
user profile iconNovo hat folgendes geschrieben:
Warum kann man nicht zu einem bestehenden projekt eine DLL statt eienr Unit erstellen?
Wenn ich Datei -> NEU -> DLL gehe, öffnet sich ein neues Projekt..
So kann man doch net arbeiten, immer hin / her Switchen!

:shock: Neue Frage, neues Topic ;)
BTW: Eine DLL ist ein eigenes Projekt und damit eine .dpr Datei, keine Unit.
Was Luckies Beiträge betrifft: Da hat er Recht. Wenn man crosspostings macht, sagt man das. Gehört zur feinen englischen Art.

Und letzten Endes muss ich auch auf die Tutorials anspielen. Dass wir dir nicht einen fertigen Quellcode liefern, kannst du dir ja denken, ein bisschen Eigeninitiative ist nunmal erforderlich. Und Luckie, als leidenschaftlicher kostenlose Tutorialschreiber, so als "unkonstruktiver Beitrag" abzustempeln, obwohl er dir einen Wink mit dem Zaunpfahl gegeben hat (bezüglich Strings & DLLs ), halte ich für mehr als nur unhöflich.
Die Einrückung in deinem Code ist übrigens eher dürftig bzw. nicht vorhanden, was der Übersichtlichkeit nicht zuträglich ist. Es macht nicht wirklich Spaß, deinen Code zu lesen und nach Fehlern zu durchsuchen.
Als erstes finde ich es seltsam, dass du deine DLL nichts exportieren lässt. (Da du die Tutorials ausgeschlagen hast, gehe ich davon aus, du weißt, wie man exportiert.)
In deine DLL bindest du Units ein, die du niemals brauchen wirst, einfach mal welche auskommentieren und sehen obs noch geht. Delphi optimiert das zum Glück weg, aber fein sieht's nicht aus.
Ich sehe auch gerade, dass du uns ne Unit und nichtmal deinen Versuch, daraus eine DLL zu machen gepostet hast... Tja.
Da du einen Usernamen ermitteln willst, wäre es vielleicht sinniger, eine Funktion mit einem PChar als Rückgabewert zu schreiben, deren Result dann der Username ist. Eine DLL, die eine ShowMessage aufruft ...

_________________
>+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
kisch Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 43

Delphi 7, TDEngine, Linux

BeitragVerfasst: So 14.10.07 11:21 
user profile iconJayEff hat folgendes geschrieben:
user profile iconNovo hat folgendes geschrieben:
Warum kann man nicht zu einem bestehenden projekt eine DLL statt eienr Unit erstellen?
Wenn ich Datei -> NEU -> DLL gehe, öffnet sich ein neues Projekt..
So kann man doch net arbeiten, immer hin / her Switchen!

:shock: Neue Frage, neues Topic ;)
BTW: Eine DLL ist ein eigenes Projekt und damit eine .dpr Datei, keine Unit.
Was Luckies Beiträge betrifft: Da hat er Recht. Wenn man crosspostings macht, sagt man das. Gehört zur feinen englischen Art.

Und letzten Endes muss ich auch auf die Tutorials anspielen. Dass wir dir nicht einen fertigen Quellcode liefern, kannst du dir ja denken, ein bisschen Eigeninitiative ist nunmal erforderlich. Und Luckie, als leidenschaftlicher kostenlose Tutorialschreiber, so als "unkonstruktiver Beitrag" abzustempeln, obwohl er dir einen Wink mit dem Zaunpfahl gegeben hat (bezüglich Strings & DLLs ), halte ich für mehr als nur unhöflich.
Die Einrückung in deinem Code ist übrigens eher dürftig bzw. nicht vorhanden, was der Übersichtlichkeit nicht zuträglich ist. Es macht nicht wirklich Spaß, deinen Code zu lesen und nach Fehlern zu durchsuchen.
Als erstes finde ich es seltsam, dass du deine DLL nichts exportieren lässt. (Da du die Tutorials ausgeschlagen hast, gehe ich davon aus, du weißt, wie man exportiert.)
In deine DLL bindest du Units ein, die du niemals brauchen wirst, einfach mal welche auskommentieren und sehen obs noch geht. Delphi optimiert das zum Glück weg, aber fein sieht's nicht aus.
Ich sehe auch gerade, dass du uns ne Unit und nichtmal deinen Versuch, daraus eine DLL zu machen gepostet hast... Tja.
Da du einen Usernamen ermitteln willst, wäre es vielleicht sinniger, eine Funktion mit einem PChar als Rückgabewert zu schreiben, deren Result dann der Username ist. Eine DLL, die eine ShowMessage aufruft ...


Hallo Jan-Felix,
lange Rede kurzer Sinn: vor etlichen Jahren war es wesentlich angenehmer, einen Beitrag zu posten. Die Umgangsform im Forum war auf Höflichkeit und und konstruktiver Problemlösung angelegt. So war auf kommunikativer Basis oft schnell ein Lösungsansatz gefunden.

zu deinen Anmerkungen:
-natürlich exportiert die dll "etwas", nämlich genau die vorgesehene Prozedur. Die exports-Klausel befindet sich im übergeordneten Projekt. Das ist beabsichtigt.
-das eigentliche Problem in meiner dll scheint der Zugriff auf die Window.pas zu sein. Genau dort befindet sich die für mich wichtige Funktion "GetUserName".
Ich glaube, dass ich - wie bei der Überführung eines lauffähigen Delphi-Programms in eine dll nicht unüblich - im type-Bereich den Zugriff manuell verdrahten muss. In meinem letzten Indy-Projekt war dies kein Problem. Hier indes weiss ich zur Zeit leider nicht weiter.
Insofern freue ich mich selbstverständlich über einen - wie gesagt - konstruktiven und konkreten Lösungsvorschlag.
Redundanten und polemischen Betrachtungsweisen zu meiner freundlichen Anfrage bin ich indessen überdrüssig.

Mit besten Grüßen

Kisch
Martok
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 3661
Erhaltene Danke: 604

Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
BeitragVerfasst: So 14.10.07 11:41 
Hallo kisch!

Schön dass mal einer auf Umgangsformen Wert leg. Aber das was du machst ist grad ziemlich überheblich. Woher sollen wir bitte deinen anderen Code kennen? Hast du das irgendwo erwähnt? Nein.

Naja, jedenfalls.

Du willst hier einen String zurückgeben, ohne den zu initialisieren. Oder wird das in der Host-Anwendung gemacht? In jedem Fall wird an keiner Stelle weitergegeben wie viel Speicher denn nun für den String reserviert wurde. Schonmal ein Speicherleck.
Da es so jedoch nicht funktioniert, gehe ich davon aus das MyWideString nie initialisiert wird. Außerdem würde ich mal versuchen, statt UserName 3mal zu kopieren, den direkt als PChar zu nehmen.

mfg
Martok

_________________
"The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."
hathor
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: So 14.10.07 17:16 
So, wie ich den Thread verfolgt habe, muss ich annehmen, dass kisch immer noch keine Lösung gefunden oder bekommen hat...

Man soll täglich eine gute Tat tun, deshalb hier...

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
library USERNAME;

uses
  SysUtils,
  Windows;

{$R *.res}

var
  szUserName : array[0..99of Char;

function UNGetUserName: PChar; stdcall;
var
  dwLen : DWORD;
begin
  dwLen := SizeOf(szUserName);
  FillChar(szUserName, dwLen, #0);
  GetUserName(szUserName, dwLen);
  Result := @szUserName;
end;

exports
   UNGetUserName;
   
begin
end.

//--------------------------------------------------
unit Frm;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComCtrls;

type
  TForm1 = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    procedure FormShow(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

const
  cDLL = 'USERNAME.dll';

function UNGetUserName: PChar; stdcallexternal cDLL;

implementation

{$R *.dfm}


procedure TForm1.FormShow(Sender: TObject);
begin
  Label2.Caption := UNGetUserName;
end;

end.
Einloggen, um Attachments anzusehen!
kisch Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 43

Delphi 7, TDEngine, Linux

BeitragVerfasst: Mo 15.10.07 16:19 
user profile iconhathor hat folgendes geschrieben:
So, wie ich den Thread verfolgt habe, muss ich annehmen, dass kisch immer noch keine Lösung gefunden oder bekommen hat...

Man soll täglich eine gute Tat tun, deshalb hier...

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
library USERNAME;

uses
  SysUtils,
  Windows;

{$R *.res}

var
  szUserName : array[0..99of Char;

function UNGetUserName: PChar; stdcall;
var
  dwLen : DWORD;
begin
  dwLen := SizeOf(szUserName);
  FillChar(szUserName, dwLen, #0);
  GetUserName(szUserName, dwLen);
  Result := @szUserName;
end;

exports
   UNGetUserName;
   
begin
end.

//--------------------------------------------------
unit Frm;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComCtrls;

type
  TForm1 = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    procedure FormShow(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

const
  cDLL = 'USERNAME.dll';

function UNGetUserName: PChar; stdcallexternal cDLL;

implementation

{$R *.dfm}


procedure TForm1.FormShow(Sender: TObject);
begin
  Label2.Caption := UNGetUserName;
end;

end.


Ich habe noch schnell eine Prozedur daraus erstellt, auf PWChar umgemünzt. Die Geschichte läuft nun tadellos.

Verbindlichen Dank für die Mühe.

Mit besten Grüßen

Kisch