AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Zugriff auf Classes\CLSID

Ein Thema von venice2 · begonnen am 4. Jul 2020 · letzter Beitrag vom 5. Jul 2020
Antwort Antwort
venice2
(Gast)

n/a Beiträge
 
#1

AW: Zugriff auf Classes\CLSID

  Alt 4. Jul 2020, 22:06
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;
Nun dann öffnest du den Key mit Adminrechten denn bei mir geht es nicht.
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:
Just use OpenKey instead of OpenKeyReadOnly, this won't reset your Access property.
siehe

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;

Geändert von venice2 ( 4. Jul 2020 um 22:27 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.609 Beiträge
 
Delphi 12 Athens
 
#2

AW: Zugriff auf Classes\CLSID

  Alt 4. Jul 2020, 23:08
Nun dann öffnest du den Key mit Adminrechten denn bei mir geht es nicht.
OpenKeyReadOnly verwendet lediglich KEY_READ als Access-Code, während OpenKey mit KEY_ALL_ACCESS arbeitet (falls nicht absichtlich geändert). Der Hinweis aus dem Link zieht hier ja ganz bewusst nicht, da ich ja gezielt den Access-Code so ändern will, damit ich das lesen kann. Es hat auch nichts mit Adminrechten zu tun, denn bei mir liefert ein OpenKey auch auch kein Ergebnis.

Wenn nicht noch irgendwelche anderen Bedingungen gelten, von denen wir nichts wissen, dann sollte auch der Zugriff aus einer DLL kein Problem darstellen.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
venice2
(Gast)

n/a Beiträge
 
#3

AW: Zugriff auf Classes\CLSID

  Alt 4. Jul 2020, 23:13
Nun dann öffnest du den Key mit Adminrechten denn bei mir geht es nicht.
OpenKeyReadOnly verwendet lediglich KEY_READ als Access-Code, während OpenKey mit KEY_ALL_ACCESS arbeitet (falls nicht absichtlich geändert). Der Hinweis aus dem Link zieht hier ja ganz bewusst nicht, da ich ja gezielt den Access-Code so ändern will, damit ich das lesen kann. Es hat auch nichts mit Adminrechten zu tun, denn bei mir liefert ein OpenKey auch auch kein Ergebnis.

Wenn nicht noch irgendwelche anderen Bedingungen gelten, von denen wir nichts wissen, dann sollte auch der Zugriff aus einer DLL kein Problem darstellen.
Ok Danke.
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.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.609 Beiträge
 
Delphi 12 Athens
 
#4

AW: Zugriff auf Classes\CLSID

  Alt 4. Jul 2020, 23:13
Hast du es mal aus einem simplen Testprogramm heraus versucht?
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
venice2
(Gast)

n/a Beiträge
 
#5

AW: Zugriff auf Classes\CLSID

  Alt 4. Jul 2020, 23:14
Hast du es mal aus einem simplen Testprogramm heraus versucht?
Könnte ich mal machen.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.609 Beiträge
 
Delphi 12 Athens
 
#6

AW: Zugriff auf Classes\CLSID

  Alt 4. Jul 2020, 23:16
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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
venice2
(Gast)

n/a Beiträge
 
#7

AW: Zugriff auf Classes\CLSID

  Alt 4. Jul 2020, 23:21
Einfache EXE funktioniert aus DLL der gleiche Code nicht.
Warum?
Delphi-Quellcode:
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;
Ich bekomme den Zugriff mit OpenKeyReadOnly oder OpenKey denke der ausschlaggebende punkt hierbei ist wie die Registry erstellt wird.
Bei mir mit KEY_READ
Es geht mit 'SOFTWARE\Classes\Wow6432Node\CLSID'; und ohne Wow6432Node 'SOFTWARE\Classes\CLSID'; daran liegt es nicht.

Geändert von venice2 ( 4. Jul 2020 um 23:37 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.609 Beiträge
 
Delphi 12 Athens
 
#8

AW: Zugriff auf Classes\CLSID

  Alt 5. Jul 2020, 00:11
Einfache EXE funktioniert aus DLL der gleiche Code nicht.
Auch nicht mit einer neuen, sonst nackten DLL nicht?

Ich bekomme den Zugriff mit OpenKeyReadOnly oder OpenKey denke der ausschlaggebende punkt hierbei ist wie die Registry erstellt wird.
Bei mir mit KEY_READ
Ja, in dem Fall sollte auch OpenKey funktionieren.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
venice2
(Gast)

n/a Beiträge
 
#9

AW: Zugriff auf Classes\CLSID

  Alt 5. Jul 2020, 00:12
Das ist auch seltsam.
Mal mit der Exe getestet.

Delphi-Quellcode:
     
     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;
gebe ich anstelle von '(Standard)' ThreadingModel an dann wird Apartment zurück gegeben.
Bei der default Value immer ein Leerstring und genau hier steht der Pfad zur DLL.

Zitat:
Auch nicht mit einer neuen, sonst nackten DLL nicht?
Hab ich noch nicht getestet.

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

Geändert von venice2 ( 5. Jul 2020 um 00:50 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:59 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