| Autor |
Beitrag |
darktrym
      
Beiträge: 20
|
Verfasst: So 16.05.04 16:05
Hallo,
Ich schreibe gerade an einen Programm, was auf der MSDOS Konsole läuft. Nun will ich das Programm möglicht klein halten, deshalb nonvcl. Leider muss auf die Registry zu greifen. Dafür muss ich die Registry Unit benutzen. Mein Problem ist, um die Konstante HKEY_LOCAL_MACHINE zu benutzen die für
Reg.RootKey:=HKEY_LOCAL_MACHINE gebraucht wird, muss ich die Unit Windows einbinden, was mein Programm schwups zig KB(glaube Größe hat sich verdoppelt von 40 auf 85) vergrößert. Gibts irgendwie eine Alternative, ohne Unit Windows?
Code Schnipsel:
Delphi-Quelltext 1: 2: 3: 4:
| Reg:=TRegistry.create; Reg.RootKey:=HKEY_LOCAL_MACHINE; Reg.OpenKey(StartKey,false); st:=Reg.ReadString('START'); |
Moderiert von Klabautermann: Delphi-Tags hinzugefügt
|
|
Raphael O.
      
Beiträge: 1596
VS 2013
|
Verfasst: So 16.05.04 16:20
ich glaube, dass das nur ne konstante mit dem Wert 2147483650 ist...
wenn dem nicht so ist, dann bitte verbessern 
|
|
darktrym 
      
Beiträge: 20
|
Verfasst: So 16.05.04 16:54
| Fiji-Fighter hat folgendes geschrieben: | ich glaube, dass das nur ne konstante mit dem Wert 2147483650 ist...
wenn dem nicht so ist, dann bitte verbessern  |
Ist keine Konstante mit diesem Wert!Habs ausprobiert!Irgendwie verändert Delphi noch was dran, da alle Hauptschlüssel 2^31+Auswahl als Zahlenwert bekommen, aber bei direkte Zuweisung kann dann das Programm den Schlüssel nicht auslesen. Vielleicht gibts noch eine Unit in der das auch gespeichert ist, wo Delphi nicht zu viel Konstanten kennt, die es im Code abspeichern muss?
|
|
raziel
      
Beiträge: 2453
Arch Linux
JS (WebStorm), C#, C++/CLI, C++ (VS2013)
|
Verfasst: So 16.05.04 17:10
Eine Konstante ist eine Konstante, da kann nich ma Delphi was dran rütteln...
Dieser code funktioniert bei mir einwandfrei:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| procedure TForm1.Button1Click(Sender: TObject); var r: TRegistry; begin r := TRegistry.Create; r.RootKey := $80000002; r.OpenKey('Software\Microsoft\Windows\CurrentVersion\Run', false); showmessage(r.ReadString('nwiz')); FreeAndNil(r); end; |
'nwiz' muss natürlich durch was passendes deinerseits ersetzt werden.
raziel
_________________ JSXGraph
|
|
Motzi
      
Beiträge: 2931
XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
|
Verfasst: So 16.05.04 17:46
Du kannst doch einfach einen Blick in die Windows.pas werfen.. da findest du dann diese Zeilen:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| const
{$EXTERNALSYM HKEY_CLASSES_ROOT} HKEY_CLASSES_ROOT = DWORD($80000000); {$EXTERNALSYM HKEY_CURRENT_USER} HKEY_CURRENT_USER = DWORD($80000001); {$EXTERNALSYM HKEY_LOCAL_MACHINE} HKEY_LOCAL_MACHINE = DWORD($80000002); {$EXTERNALSYM HKEY_USERS} HKEY_USERS = DWORD($80000003); {$EXTERNALSYM HKEY_PERFORMANCE_DATA} HKEY_PERFORMANCE_DATA = DWORD($80000004); {$EXTERNALSYM HKEY_CURRENT_CONFIG} HKEY_CURRENT_CONFIG = DWORD($80000005); {$EXTERNALSYM HKEY_DYN_DATA} HKEY_DYN_DATA = DWORD($80000006); |
Einfach in dein Programm einfügen und du kannst die Konstanten wie gewohnt weiter verwenden..!
_________________ gringo pussy cats - eef i see you i will pull your tail out by eets roots!
|
|
darktrym 
      
Beiträge: 20
|
Verfasst: So 16.05.04 17:51
Habs gestern eine Stunde probiert und jetzt geht das!
Danke für Hinweis! Ist wohl mein Rechner vorher abgeschmiert.
Nochne 2te Frage, wie kann ich das Verzeichnis von Windows ermitteln ohne GetWindowsDirectory(WinDir, 144),da das wieder die Unit Windows braucht.
Vielleicht mittels Registry?
|
|
Motzi
      
Beiträge: 2931
XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
|
Verfasst: So 16.05.04 18:02
_________________ gringo pussy cats - eef i see you i will pull your tail out by eets roots!
|
|
bms
      
Beiträge: 735
Win XP
Delphi 3, Delphi 6 PE, Delphi 2005 PE
|
Verfasst: So 16.05.04 18:09
| darktrym hat folgendes geschrieben: | | Nun will ich das Programm möglicht klein halten, deshalb nonvcl. |
Du hast die Antwort auf deine Frage selbst gegeben. Du hast gesagt, daß du etwas NonVcl machen willst. Also fast alles kannst du auch über API machen.
_________________ VORSICHT: Ich behersche seit heute die Fünf-Finger-Handflächen-Herz-Explodier-Schlag-Kampf-Technik >
|
|
Motzi
      
Beiträge: 2931
XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
|
Verfasst: So 16.05.04 18:15
| bms hat folgendes geschrieben: | | darktrym hat folgendes geschrieben: | | Nun will ich das Programm möglicht klein halten, deshalb nonvcl. |
Du hast die Antwort auf deine Frage selbst gegeben. Du hast gesagt, daß du etwas NonVcl machen willst. Also fast alles kannst du auch über API machen. |
Die Frage war aber etwas ganz anderes..! 
_________________ gringo pussy cats - eef i see you i will pull your tail out by eets roots!
|
|
bms
      
Beiträge: 735
Win XP
Delphi 3, Delphi 6 PE, Delphi 2005 PE
|
Verfasst: So 16.05.04 23:22
| Motzi hat folgendes geschrieben: | | bms hat folgendes geschrieben: | | darktrym hat folgendes geschrieben: | | Nun will ich das Programm möglicht klein halten, deshalb nonvcl. |
Du hast die Antwort auf deine Frage selbst gegeben. Du hast gesagt, daß du etwas NonVcl machen willst. Also fast alles kannst du auch über API machen. |
Die Frage war aber etwas ganz anderes..!  |
Und was soll diese Stichelei jetzt? Das ist ein perfektes Beispiel dafür wie einer hier in diesem Forum fertig gemacht wird. Ich bin momentan richtig fertig mit den Nerven. Mein Herz rast gerade wie verückt. Ich komme mit so einer Ungerechtigkeit nicht klar.
Ich hab nur drauf hingewiesen, was auch die anderen ausgesagt haben. Wenn er den Speicher sparen will, dann soll nicht nur von NonVcl reden, sondern seine Funktionen gleich in der API suchen. Wieso hat das nichts mit seiner Frage zu tun?
_________________ VORSICHT: Ich behersche seit heute die Fünf-Finger-Handflächen-Herz-Explodier-Schlag-Kampf-Technik >
|
|
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mo 17.05.04 08:09
Ich persönlich halte es für falsch, auf die Windows-Unit zu verzichten. Dabei würde ich eher an dieser Stelle hier
| darktrym hat folgendes geschrieben: | Delphi-Quelltext 1: 2: 3: 4:
| Reg:=TRegistry.create; Reg.RootKey:=HKEY_LOCAL_MACHINE; Reg.OpenKey(StartKey,false); st:=Reg.ReadString('START'); | |
ansetzen, und die TRegistry-Aufrufe durch die entsprechenden API-Funktionen ersetzen. Ein nonVCL-Programm hat nun mal eine gewisse Grundgröße. Sicher könntest du diese etwas unterbieten, indem du auf die Windows-Unit verzichtest und die von dir, @darktrym, benötigten Funktionen selbst importierst. Aber wozu?
Typische nonVCL-Programme, die nur die Units Windows und Messages benutzen, liegen im Bereich von 16 bis 20 kB. Das ist nicht verkehrt. Damit kann man leben, denke ich.
|
|
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mo 17.05.04 10:10
Also: Bei Delphi 5 war ich mir vorher schon sicher, bei Delphi 7 allerdings nicht so. Ich habe nämlich auch ein Programm, das keine "fett machenden" Borland-Units enthält und trotzdem mit D7 auf 95k anstieg, während die mit D5 kompilierte Exe nur 42k hat.
Aber um auf das Thema zurückzukommen -
Die Windows-Unit ist definitiv nicht die Ursache für die Programmgröße von deinen 80k, @darktrym. Ich will dich nicht aufhalten, schon damit ich hinterher sagen kann "Siehste, ich hab´s dir gleich gesagt"  , also
| Zitat: | | wie kann ich das Verzeichnis von Windows ermitteln ohne GetWindowsDirectory(WinDir, 144),da das wieder die Unit Windows braucht. |
folge dem Tipp von Motzi, entferne die Windows-Unit und importiere die Funktion "GetWindowsDirectory" selbst. Aber du wirst, denke ich, mit Erschrecken feststellen, dass sich dadurch an deinem Programm und seiner Größe nichts ändert. Wie gesagt: Der Schuldige ist die Registry-Unit.
Ich kann´s auch belegen. Ich habe ein kurzes Programm, völlig ohne Forms usw., das nur einen Wert aus der Registry liest und diesen anzeigt. Benutzt werden nur die Units Windows (wg. "MessageBox" und der HKEY_???-Konstanten) und Registry. Ungekürzt:
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:
| program Project1;
uses Windows, Registry; const StartKey = 'Software\Microsoft\Windows\CurrentVersion\Run'; var st : string; reg : TRegistry; begin st := '';
reg := TRegistry.Create(KEY_READ); if(reg <> nil) then try reg.RootKey := HKEY_LOCAL_MACHINE;
if(reg.OpenKey(StartKey,false)) then try st := reg.ReadString('START'); finally reg.CloseKey; end; finally reg.Free; end;
MessageBox(0,pchar(st),'Ergebnis',0); end. |
Mit Delphi 5 kompiliert ergibt das eine 60,5k große Exe.
Mit Delphi 7 bläht sich das Kompilat sogar auf 89k auf.
Entfernt man jetzt die Registry-Unit und verwendet nur die dahinter liegenden API-Funktionen, dann ergibt das ein Programm mit einer Größe von 16,5k (Delphi 5) bzw. sogar 15,5k (D7). Allerdings ist der Code etwas umfangreicher, zudem habe ich ihn auch noch kommentiert (dadurch sieht es noch länger aus). Aber das ändert nichts am Ergebnis:
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: 67: 68: 69: 70: 71: 72: 73: 74:
| program Project1;
uses Windows; const StartKey = 'Software\Microsoft\Windows\CurrentVersion\Run'; var reg : HKEY; dwType, dwLen : dword; st : string; begin st := '';
if(RegOpenKeyEx(HKEY_LOCAL_MACHINE, StartKey, 0, KEY_READ, reg) = ERROR_SUCCESS) then try dwType := REG_NONE; dwLen := 0; if(RegQueryValueEx(reg, 'START', nil, @dwType, nil, @dwLen) = ERROR_SUCCESS) then begin if((dwType = REG_SZ) or (dwType = REG_EXPAND_SZ)) and (dwLen > 0) then begin SetLength(st,dwLen); if(RegQueryValueEx(reg, 'START', nil, @dwType, @st[1], @dwLen) = ERROR_SUCCESS) then SetLength(st,dwLen - 1) else st := ''; end; end; finally RegCloseKey(reg); end;
MessageBox(0,pchar(st),'Ergebnis',0); end. |
Ich empfehle einen Blick in Microsofts "PLATFORM SDK". Das ist nie verkehrt, insbesondere dann nicht wenn du etwas zu den benutzten Funktionen erfahren willst. Und für Delphi-Entwickler interessant ist vielleicht auch passende Lektüre, wie bspw. die Win32-API-Tutorials für Delphi, die sich generell mit dem Thema nonVCL beschäftigen, und die auch ein Kapitel über die Registry enthalten.
(Aber bei den Tutorials bin ich wahrscheinlich parteiisch. )
|
|
Motzi
      
Beiträge: 2931
XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
|
Verfasst: Mo 17.05.04 10:20
Ist ja auch kein Wunder wenn man sich mal die Uses-Liste der Registry-Unit anschaut (Delphi6):
Delphi-Quelltext 1:
| uses {$IFDEF LINUX} WinUtils, {$ENDIF} Windows, Classes, SysUtils, IniFiles; |
@bms: das war keineswegs eine Stichelei! Ich wollte damit nur andeuten, dass seine Frage eigentlich war wie er die Konstanten auch ohne Windows-Unit verwenden kann. Dass er weiß was API-Funktionen sind und wie man sie einsetzt davon bin ich mal ausgegangen, da er ja selbst gesagt hat, dass er nonVCL arbeiten will..!
_________________ gringo pussy cats - eef i see you i will pull your tail out by eets roots!
|
|
darktrym 
      
Beiträge: 20
|
Verfasst: Mo 17.05.04 12:06
Gibts denn keine Bibliothken für kleinere Delphi Programme. Hab mich ein paar Stunden beschäftigt, scheint mir recht kompiliziert und umständlich. Besonders nervig von Hand aus die Registry Unit von überflüssigen Ballast zu säubern, da fast jede Funk/Proc/Varia/Konst irgendwo auftaucht und querverlinkt wird.Kann man mittels der KOL( bonanzas.rinet.ru/ ), auch die Registrybefehle ersetzen?
|
|
darktrym 
      
Beiträge: 20
|
Verfasst: Mo 17.05.04 12:55
| darktrym hat folgendes geschrieben: | | Gibts denn keine Bibliothken für kleinere Delphi Programme. Hab mich ein paar Stunden beschäftigt, scheint mir recht kompiliziert und umständlich. Besonders nervig von Hand aus die Registry Unit von überflüssigen Ballast zu säubern, da fast jede Funk/Proc/Varia/Konst irgendwo auftaucht und querverlinkt wird.Kann man mittels der KOL( bonanzas.rinet.ru/ ), auch die Registrybefehle ersetzen? |
Außerdem scheints so das KOLDistro 0.11 mit Delphi 7 deu sich nicht verträgt. Unterschiedliche Version von SysUtils meldet mein Delphi
|
|
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mo 17.05.04 13:17
| darktrym hat folgendes geschrieben: | | Hab mich ein paar Stunden beschäftigt, scheint mir recht kompiliziert und umständlich. |
Wieso? Borland nutzt die gleichen API-Funktion, kapselt sie nur in ein etwas leichteres Interface. Dass dabei noch andere Dinge eingebunden werden, mag vielleicht unschön sein, hat aber in vielen Programmen durchaus seine Berechtigung. Ansonsten musst du die Funktionen eben "zu Fuß" (sprich: selbst) einbinden.
| Zitat: | | Besonders nervig von Hand aus die Registry Unit von überflüssigen Ballast zu säubern, da fast jede Funk/Proc/Varia/Konst irgendwo auftaucht und querverlinkt wird. |
Ich würde generell von solchen Sachen die Finger lassen. Ich weiß nicht, wie gut deine Kenntnisse sind, aber der einzige Erfolg, den du dabei erzielst, ist, dass du dir a) u.U. die Unit versaust, und b) damit deine anderen Programme funktionsuntüchtig machst.
Der Tipp gilt nach wie vor: Wenn dich das Thema nonVCL/Win32-API interessiert, dann schau dir die Tutorials an, die ich erwähnt habe, suche im Netz nach weiteren Anleitungen, wirf einen Blick in Microsofts PSDK und beschäftige dich mit der Arbeits- und Wirkungsweise der verschiedenen Funktionen. Wenn du weißt und kannst, dann siehst du einen Quellcode wie das o.g. API-Beispiel auch nicht mehr als so kompliziert an.
|
|
|