![]() |
Zugriff auf Classes\CLSID
Ich mache folgendes.
Delphi-Quellcode:
Man geht eigentlich davon aus CLSID jede menge an SubKeys zur verfügung stellt.
PRegKey.RootKey := HKEY_LOCAL_MACHINE;
FilePath := 'SOFTWARE\Classes\CLSID'; PRegKey.OpenKey(FilePath, False); if PRegKey.HasSubKeys then begin PRegKey.GetKeyNames(subKeyFilePath); PRegKey.CloseKey; end; Nur warum werden diese nicht mit PRegKey.HasSubKeys erkannt? Gibt es hier einen Trick den ich anwenden muss um Zugriff zu bekommen? Eigentlich sollte der gewährt sein beim lesen. Nebenbei. Kann man überhaupt eine ActiveX DLL mit FreeLibrary freigeben? Falls nicht dann kann ich mir das sparen. |
AW: Zugriff auf Classes\CLSID
Hallo,
das geht doch nur ReadOnly? |
AW: Zugriff auf Classes\CLSID
Ich vermute einmal, dass die Rechte fehlen und OpenKey schlicht false zurück liefert. Den Rückgabewert ignorierst du leider komplett...
Es gibt stattdessen auch OpenKeyReadOnly, für das du weniger Rechte benötigst. |
AW: Zugriff auf Classes\CLSID
Zitat:
Werde es mal mit OpenKeyReadOnly versuchen. Dann noch mal nicht geschrieben sondern eingefügt. (copy\paste)
Delphi-Quellcode:
funktioniert genau sowenig.
FilePath := 'SOFTWARE\Classes\CLSID\';
if PRegKey.OpenKey(FilePath, False) then begin if PRegKey.HasSubKeys then begin PRegKey.GetKeyNames(subKeyFilePath); PRegKey.CloseKey; end; end; Wie komme ich sonst an die Pfade der DLL's ? |
AW: Zugriff auf Classes\CLSID
Nur weil man die Rückgabewerte (teilweise) auswertet, funktioniert der Code nicht plörlich, wenn er auch Ohne bereits Fehler ausgelöst hatte und sich an der eigentlich Funktion garnichts geändert hat.
Wenn man aber die Rückgaben "richtig" auswerten würde, dann wüsste man wenigstens warum es nicht geht. |
AW: Zugriff auf Classes\CLSID
Zitat:
Nur es hilft mir leider nicht bei meinem Problem ![]() |
AW: Zugriff auf Classes\CLSID
Delphi-Quellcode:
Und schon gelesen was die Anderen schrieben?
FilePath := 'SOFTWARE\Classes\CLSID\';
if PRegKey.OpenKey(FilePath, False) then begin end else RaiseLastOSError; Wer möchte raten, was mit Close nach dem Open passiert, wenn es keine SubKeys gibt? Zitat:
|
AW: Zugriff auf Classes\CLSID
Zitat:
Schon gelesen? Zitat:
Ob ich dann RaiseLastOSError; auswerte ist doch eine ganz andere Geschichte. Alles andere hat schon seine Richtigkeit. Ich kann den Key nicht öffnen versuche es doch einfach einmal. Danke! |
AW: Zugriff auf Classes\CLSID
Ich kann - mit einer marginalen Modifizierung deines Codes gemäß der Empfehlung von Sebastian:
Delphi-Quellcode:
FilePath := 'SOFTWARE\Classes\CLSID\';
if PRegKey.OpenKeyReadOnly(FilePath) then begin if PRegKey.HasSubKeys then begin PRegKey.GetKeyNames(subKeyFilePath); PRegKey.CloseKey; end; end; |
AW: Zugriff auf Classes\CLSID
Zitat:
Gleicher Code. (Ich öffne den Key in einer DLL, vergessen zu sagen) Auch nicht mit 'SOFTWARE\Classes\Wow6432Node\CLSID'; EDIT. bzgl. OpenKeyReadOnly und OpenKey Zitat:
![]() Nochmal komplett. Ohne PRegKey.CloseKey; wird aber verwendet
Delphi-Quellcode:
PRegKey := TRegistry.Create(KEY_READ);
PRegKey.RootKey := HKEY_LOCAL_MACHINE; FilePath := 'SOFTWARE\Classes\Wow6432Node\CLSID'; // ob ich direkt auf Wow6432Node gehe oder nicht sollte eigentlich egal sein. if PRegKey.OpenKey(FilePath, False) then begin if PRegKey.HasSubKeys then begin PRegKey.GetKeyNames(subKeyFilePath); PRegKey.CloseKey; end; end; |
AW: Zugriff auf Classes\CLSID
Zitat:
Wenn nicht noch irgendwelche anderen Bedingungen gelten, von denen wir nichts wissen, dann sollte auch der Zugriff aus einer DLL kein Problem darstellen. |
AW: Zugriff auf Classes\CLSID
Zitat:
Dann weis ich auch nicht mehr weiter. (Windows 10 halt) Ich bekomme keinen Zugriff und mehr als im gezeigten Code tue ich nicht um den KEY zu lesen. |
AW: Zugriff auf Classes\CLSID
Hast du es mal aus einem simplen Testprogramm heraus versucht?
|
AW: Zugriff auf Classes\CLSID
Zitat:
|
AW: Zugriff auf Classes\CLSID
Zum Beispiel dies hier:
Delphi-Quellcode:
program Project700;
{$APPTYPE CONSOLE} {$R *.res} uses System.SysUtils, System.Classes, System.Win.Registry, Winapi.Windows; procedure Main; var FilePath: string; PRegKey: TRegistry; subKeyFilePath: TStringList; begin subKeyFilePath := TStringList.Create(); try PRegKey := TRegistry.Create; try PRegKey.RootKey := HKEY_LOCAL_MACHINE; FilePath := 'SOFTWARE\Classes\CLSID\'; if PRegKey.OpenKeyReadOnly(FilePath) then begin if PRegKey.HasSubKeys then begin PRegKey.GetKeyNames(subKeyFilePath); PRegKey.CloseKey; end; end; finally PRegKey.Free; end; Writeln(subKeyFilePath.Text); finally subKeyFilePath.Free; end; end; begin try Main; except on E: Exception do Writeln(E.ClassName, ': ', E.Message); end; Readln; end. |
AW: Zugriff auf Classes\CLSID
Einfache EXE funktioniert aus DLL der gleiche Code nicht.
Warum?
Delphi-Quellcode:
Ich bekomme den Zugriff mit OpenKeyReadOnly oder OpenKey denke der ausschlaggebende punkt hierbei ist wie die Registry erstellt wird.
procedure TForm1.Button1Click(Sender: TObject);
var FilePath: string; res: BOOL; begin PRegKey := TRegistry.Create(KEY_READ); PRegKey.RootKey := HKEY_LOCAL_MACHINE; FilePath := 'SOFTWARE\Classes\Wow6432Node\CLSID'; res := PRegKey.OpenKey(FilePath, False); if res then begin if PRegKey.HasSubKeys then begin // PRegKey.GetKeyNames(subKeyFilePath); PRegKey.CloseKey; end; end; PRegKey.Free; end; Bei mir mit KEY_READ Es geht mit 'SOFTWARE\Classes\Wow6432Node\CLSID'; und ohne Wow6432Node 'SOFTWARE\Classes\CLSID'; daran liegt es nicht. |
AW: Zugriff auf Classes\CLSID
Zitat:
Zitat:
|
AW: Zugriff auf Classes\CLSID
Das ist auch seltsam.
Mal mit der Exe getestet.
Delphi-Quellcode:
gebe ich anstelle von '(Standard)' ThreadingModel an dann wird Apartment zurück gegeben.if subKeyFilePath.Count > 0 then for I := 0 to subKeyFilePath.Count - 1 do begin if subKeyFilePath[i] = '{43D2E184-46AC-11d4-A8AF-00105AC582C2}' then begin if PRegKey.OpenKey(FilePath + '\' + subKeyFilePath[i] + '\InprocServer32', False) then begin Path := PRegKey.ReadString('(Standard)'); Label1.Caption := Path; end; break; end; end; Bei der default Value immer ein Leerstring und genau hier steht der Pfad zur DLL. Zitat:
Das ist ärgerlich. Ich habe vorher die DLL (ActiveX) mit CoCreateInstance initialisiert. Nun habe ich gedacht weil diese sich nicht entladen ließ versuche ich die Typelib zur Laufzeit zu laden. Also mit LoadLibrary in Verbindung mit LoadTypeLib Um dann über FreeLibrary die DLL zu entladen wenn sie nicht mehr gebraucht wird. Das funktioniert ebenfalls nicht selbst wenn ich ein gültiges Handle davon habe. :stupid: Ich kann das im Prozess Explorer verfolgen. Das ist zum Haare raufen. Hier dein Beispiel nochmal zurück mit meiner Änderung.
Delphi-Quellcode:
program Project2;
{$APPTYPE CONSOLE} {$R *.res} uses SysUtils, Classes, Registry, Windows; procedure Main; var FilePath: string; Path: string; PRegKey: TRegistry; subKeyFilePath: TStringList; i: Integer; begin subKeyFilePath := TStringList.Create(); try PRegKey := TRegistry.Create; try PRegKey.RootKey := HKEY_LOCAL_MACHINE; FilePath := 'SOFTWARE\Classes\CLSID\'; if PRegKey.OpenKeyReadOnly(FilePath) then begin if PRegKey.HasSubKeys then begin PRegKey.GetKeyNames(subKeyFilePath); PRegKey.CloseKey; end; end; Writeln(subKeyFilePath.Text); if subKeyFilePath.Count > 0 then for I := 0 to subKeyFilePath.Count - 1 do begin if subKeyFilePath[i] = '{43D2E184-46AC-11d4-A8AF-00105AC582C2}' then begin if PRegKey.OpenKey(FilePath + '\' + subKeyFilePath[i] + '\InprocServer32', False) then begin Path := PRegKey.ReadString('ThreadingModel'); // mit (Standard) ersetzen verursacht Probleme Leerstring wird zurück gegeben. Writeln('GetValue := ' + Path); break; end; end; end; finally PRegKey.Free; end; finally subKeyFilePath.Free; end; end; begin try Main; except on E: Exception do Writeln(E.ClassName, ': ', E.Message); end; Readln; end. |
AW: Zugriff auf Classes\CLSID
Zitat:
OK, dann bin ich mal weg. Entweder du willst wissen warum es nicht geht oder nicht, aber wenn nicht, dann heul nicht rum.
Delphi-Quellcode:
Ich bekomme da erstmal das Wichtigste bei raus.
if PRegKey.OpenKey(...
else WriteLn(PRegKey.LastErrorMsg); //RaiseLastOSError(PRegKey.LastError); * Zugriff verwigert * Pfad nicht gefunden * Pfad ungültig * ... Bei Ersterem geh ich dann in den Registryeritor und schau mit dir Berechtigungen an z.B. HKEY_LOCAL_MACHINE\SOFTWARE : Admin=Vollzugriff und Benutzer=NurLesen Und falls du grade mit etwas anderem als Admin oder Benutzer unterwegs bist, dann können wir das nicht wissen, es sei denn jemand sagt etwas. Zitat:
Nja, es kommt auch drauf an warum man es wann macht. In deinem Fall wird es dort nur gemacht, damit es beim nächsten OpenKey nicht knallt, was man dann schon besser mal als Kommentar dahinter schreiben sollte, sonst weiß es niemand. OK, da TRegistry mit relativen Pfaden arbeitet, wäre es vielleicht stattdessen "logischer" mit absuluten Pfadangaben zu arbeiten, wenn man diese übergibt. Ob EXE oder DLL ist total egal, denn der Prozess, bzw. der Thread hat die Rechte und wo der Code ausgeführt wird interessiert niemanden. (außer vielleicht jemand kommt auf die Idee sowas z.B. in einem Virenscanner einzubauen, aber bis jetzt noch nicht) Und ja, bei mir wird das Verzeichnis problemlos ausgelesen, außer dass es anschließend das {43D2E184-46AC-11d4-A8AF-00105AC582C2} hier nicht gibt. |
AW: Zugriff auf Classes\CLSID
Zitat:
Zitat:
Das ergebniss.
Delphi-Quellcode:
Das System kann die angegebene Datei nicht finden. (wenn aus der DLL aufgerufen)
PRegKey.RootKey := HKEY_LOCAL_MACHINE;
FilePath := 'SOFTWARE\Classes\CLSID\'; if PRegKey.OpenKey(FilePath, False) then begin if PRegKey.HasSubKeys then begin PRegKey.GetKeyNames(subKeyFilePath); PRegKey.CloseKey; end; end else begin FilePath := (PRegKey.LastErrorMsg); PRegKey.CloseKey; end; Seltsam. Was für eine Datei? |
AW: Zugriff auf Classes\CLSID
Hallo,
vielleicht hilft dies. PRegKey:=TRegistry.Create(KEY_READ or KEY_WOW64_64KEY); Gruß |
AW: Zugriff auf Classes\CLSID
Ich glaube zwar nicht, dass es in diesem Fall irgendetwas bewirkt, aber eigentlich solltest du HKEY_CLASSES_ROOT nehmen und den SubKey leer lassen. Das liefert dir die effektive Sicht deiner Applikation auf die COM-Registrierung, inklusive der per-User Registrierungen.
Siehe: ![]() Zitat:
|
AW: Zugriff auf Classes\CLSID
Zitat:
![]() |
AW: Zugriff auf Classes\CLSID
Zitat:
Aber HKEY_CURRENT_USER scheint zu funktionieren. Aber dort befindet sich die ClassID nicht. |
AW: Zugriff auf Classes\CLSID
OK, SubKey ganz leer lassen stimmt nicht so wirklich, aber mit dieser Code-Änderung bekomme ich zumindest ein brauchbares Ergebnis:
Delphi-Quellcode:
PRegKey.RootKey := HKEY_CLASSES_ROOT;
FilePath := 'CLSID\'; |
AW: Zugriff auf Classes\CLSID
Zitat:
|
AW: Zugriff auf Classes\CLSID
Zitat:
|
AW: Zugriff auf Classes\CLSID
Zitat:
Aber! Manchmal sitzt das Problem vor dem Monitor. Man vergleiche.
Delphi-Quellcode:
PRegKey.RootKey := HKEY_LOCAL_MACHINE;
FilePath := 'SOFTWARE\Classes\CLSID\';
Delphi-Quellcode:
if PRegKey.OpenKey(FilePath + '\' + subKeyFilePath[i] + '\InprocServer32', False) then
Vielleicht erkennt ja jemand meinen Fehler ;) Desto-trotz ist die Abfrage nach dem Pfad = NULL Keine Ahnung wie ich eine Positive Rückgabe bekomme wenn ich den Default wert eintrage.
Delphi-Quellcode:
Path := PRegKey.ReadString('ThreadingModel'); // mit (Standard) ersetzen
Bekommt man hier grundsätzlich keine Rückgabe? Danke für eure Hilfe EDIT: Grrr.. war die EXE Problem bleibt trotzdem bestehen. Datei wird nicht gefunden. (DLL) Muss im Moment mal Abstand davon nehmen komme zu keinem Ergebnis. |
AW: Zugriff auf Classes\CLSID
Du hast ja den Process Explorer angesprochen. Hast du auch einmal den Process Monitor verwendet? Dort siehst du ja die einzelnen Registry Zugriffe, ob sie erfolgreich waren, den richtigen Pfad verwenden, usw.
|
AW: Zugriff auf Classes\CLSID
Zitat:
Das Problem mit dem Leerstring bleibt jedoch bestehen.
Delphi-Quellcode:
Bin momentan komplett gegen den Wind. :oops:
PRegKey.RootKey := HKEY_CLASSES_ROOT;
FilePath := 'CLSID\'; |
AW: Zugriff auf Classes\CLSID
Könnte es an Groß-/Kleinschreibung der Keys liegen? Probeweise mal den Vergleich mit SameText machen.
|
AW: Zugriff auf Classes\CLSID
Zitat:
Habe die Zeichenfolge exakt aus der Registry kopiert. ![]() Funktioniert nicht was man aber eigentlich voraussetzt Path := PRegKey.ReadString('(Standard)'); Funktioniert. Path := PRegKey.ReadString(''); Was für eine Logik. (Denke hat mit den unterschiedlichen Länder Sprachen zu tun.) English = Default, Deutsch = Standard Um die Sprachen zu umgehen nimmt man dann hier einfach einen Leerstring. Wie auch immer So geht es nun. Danke nochmal an alle. |
AW: Zugriff auf Classes\CLSID
Zitat:
|
AW: Zugriff auf Classes\CLSID
Zitat:
Dann weis ich nun bescheid warum es nicht funktioniert hat. |
AW: Zugriff auf Classes\CLSID
Das ist mal wieder ein klassisches Beispiel für den Wert reproduzierbaren Test-Codes. Ich bin die ganze Zeit davon ausgegangen, daß der Zugriff auf InprocServer32 kein Ergebnis liefert.
|
AW: Zugriff auf Classes\CLSID
Zitat:
Aber ich schrieb ja
Delphi-Quellcode:
Path := PRegKey.ReadString('ThreadingModel'); // mit (Standard) ersetzen
ThreadingModel. funktioniert und mit (Standard) ersetzen nicht. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:01 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 by Thomas Breitkreuz