Autor |
Beitrag |
kisch
      
Beiträge: 43
Delphi 7, TDEngine, Linux
|
Verfasst: 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--------------
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); 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. | Moderiert von jasocul: Topic aus Windows API verschoben am Sa 13.10.2007 um 15:37
|
|
Timosch
      
Beiträge: 1314
Debian Squeeze, Win 7 Prof.
D7 Pers
|
Verfasst: Sa 13.10.07 15:24
kisch 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 
      
Beiträge: 43
Delphi 7, TDEngine, Linux
|
Verfasst: Sa 13.10.07 15:48
Timosch hat folgendes geschrieben: | kisch 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
|
Verfasst: 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 
      
Beiträge: 43
Delphi 7, TDEngine, Linux
|
Verfasst: Sa 13.10.07 19:29
Luckie 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
|
Verfasst: Sa 13.10.07 19:49
Doch das war sogar sehr konstruktiv, zumindest für die, die dir helfen wollen.
|
|
Novo
      
Beiträge: 90
Win XP, Win 7
Delphi 7 Enterprise, Delphi 2009
|
Verfasst: 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 
      
Beiträge: 43
Delphi 7, TDEngine, Linux
|
Verfasst: Sa 13.10.07 20:01
Luckie 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
      
Beiträge: 2971
Windows Vista Ultimate
D7 Enterprise
|
Verfasst: Sa 13.10.07 21:36
Novo 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! |
 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 
      
Beiträge: 43
Delphi 7, TDEngine, Linux
|
Verfasst: So 14.10.07 11:21
JayEff hat folgendes geschrieben: | Novo 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! |
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
      
Beiträge: 3661
Erhaltene Danke: 604
Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
|
Verfasst: 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
|
Verfasst: 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...
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..99] of 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 public end;
var Form1: TForm1;
const cDLL = 'USERNAME.dll';
function UNGetUserName: PChar; stdcall; external cDLL;
implementation
{$R *.dfm}
procedure TForm1.FormShow(Sender: TObject); begin Label2.Caption := UNGetUserName; end;
end. |
Einloggen, um Attachments anzusehen!
|
|
kisch 
      
Beiträge: 43
Delphi 7, TDEngine, Linux
|
Verfasst: Mo 15.10.07 16:19
hathor 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...
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..99] of 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 public end;
var Form1: TForm1;
const cDLL = 'USERNAME.dll';
function UNGetUserName: PChar; stdcall; external 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
|
|
|