Autor Beitrag
darktrym
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 20



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

ausblenden Delphi-Quelltext
1:
2:
3:
4:
Reg:=TRegistry.create;
Reg.RootKey:=HKEY_LOCAL_MACHINE;
Reg.OpenKey(StartKey,false);{Startkey konstante}
st:=Reg.ReadString('START');


Moderiert von user profile iconKlabautermann: Delphi-Tags hinzugefügt
Raphael O.
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1596


VS 2013
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 20



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2453

Arch Linux
JS (WebStorm), C#, C++/CLI, C++ (VS2013)
BeitragVerfasst: 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:
ausblenden 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; // <- alternativ auch "2147483650"
  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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2931

XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
BeitragVerfasst: So 16.05.04 17:46 
Du kannst doch einfach einen Blick in die Windows.pas werfen.. da findest du dann diese Zeilen:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
const
{ Reserved Key Handles. }

  {$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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 20



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2931

XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
BeitragVerfasst: So 16.05.04 18:02 
Auch hier gilt wieder.. einfach die betroffenen Zeilen aus Windows.pas rauskopieren..! Habs dir hier mal zusammengefasst.. ;)
ausblenden Delphi-Quelltext
1:
function GetWindowsDirectory(lpBuffer: PChar; uSize: UINT): UINT; stdcall; external kernel32 name 'GetWindowsDirectoryA';					

_________________
gringo pussy cats - eef i see you i will pull your tail out by eets roots!
bms
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 735

Win XP
Delphi 3, Delphi 6 PE, Delphi 2005 PE
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2931

XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
BeitragVerfasst: 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..! :roll:

_________________
gringo pussy cats - eef i see you i will pull your tail out by eets roots!
bms
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 735

Win XP
Delphi 3, Delphi 6 PE, Delphi 2005 PE
BeitragVerfasst: 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..! :roll:


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



BeitragVerfasst: 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:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
Reg:=TRegistry.create;
Reg.RootKey:=HKEY_LOCAL_MACHINE;
Reg.OpenKey(StartKey,false);{Startkey konstante}
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



BeitragVerfasst: 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:
ausblenden 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. :shock:

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:
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:
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, // Root-Schlüssel
    StartKey,                         // Pfad
    0,                                // reserviert, deswegen 0
    KEY_READ,                         // nur Lese-Zugriff
    reg) = ERROR_SUCCESS) then        // "reg" = Handle des
                                      // offenen Schlüssels
  try
    dwType := REG_NONE;               // Typ muss ermittelt werden
    dwLen  := 0;                      // Puffergröße auf Null

    if(RegQueryValueEx(reg,
      'START',                        // gesuchter Eintrag
      nil,                            // wird nicht benutzt
      @dwType,                        // Typ des Eintrags
      nil,                            // Puffer (nil in dem Fall)
      @dwLen) = ERROR_SUCCESS) then   // Puffergröße
    begin
      // Wenn der Zugriff geklappt hat, dann setzt die Funktion
      // den Typ und die Puffergröße in den beiden dword-Variablen.
      // Damit wird der Sinn auch klar: Auf die Weise erfährt man
      // ob der Wert den passenden Typ hat und wie groß der Puffer
      // sein muss, um ihn auslesen zu können.

      // Da du einen String suchst, hast du mehrere Möglichkeiten
      // REG_SZ bedeutet, dass es sich um einen typischen String
      // handelt. REG_EXPAND_SZ ist ein String, der Referenzen
      // auf Umgebungsvariablen enthalten kann, etwa
      // "%SystemRoot%\System32\msxml4.dll".
      // REG_MULTI_SZ ist ein String-Array, dessen Elemente durch
      // #0-Zeichen voneinander getrennt sind.

      // In deinem Fall sollte es daher ausreichen, den Typ auf
      // REG_SZ und REG_EXPAND_SZ zu prüfen
      if((dwType = REG_SZ) or
         (dwType = REG_EXPAND_SZ)) and
        (dwLen > 0) then              // Puffergröße muss > 0 sein
      begin
        SetLength(st,dwLen);          // String auf Größe bringen

        if(RegQueryValueEx(reg,
          'START',
          nil,
          @dwType,
          @st[1],                     // String zuweisen
          @dwLen) = ERROR_SUCCESS) then
        // Wenn die Funktion erneut problemlos aufgerufen werden
        // konnte, dann enthält "st" jetzt den Inhalt des Wertes
        // inkl. des abschließenden #0-Zeichens. Das wird entfernt,
        // indem man die Stringlänge um Eins reduziert
        SetLength(st,dwLen - 1)
        // Im Fehlerfall wird "st" komplett geleert
          else st := '';
      end;
    end;
  finally
    RegCloseKey(reg);
  end;

  MessageBox(0,pchar(st),'Ergebnis',0);
end.


Ich empfehle einen Blick in Microsofts Suche in: Delphi-Forum, Delphi-Library "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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2931

XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
BeitragVerfasst: Mo 17.05.04 10:20 
Ist ja auch kein Wunder wenn man sich mal die Uses-Liste der Registry-Unit anschaut (Delphi6):
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 20



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 20



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



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