![]() |
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? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:04 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-2025 by Thomas Breitkreuz