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
Seite 2 von 4     12 34      
Benutzerbild von Uwe Raabe
Uwe Raabe

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

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
 
#12

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.453 Beiträge
 
Delphi 12 Athens
 
#13

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
 
#14

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.453 Beiträge
 
Delphi 12 Athens
 
#15

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
 
#16

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.453 Beiträge
 
Delphi 12 Athens
 
#17

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
 
#18

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
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.071 Beiträge
 
Delphi 12 Athens
 
#19

AW: Zugriff auf Classes\CLSID

  Alt 5. Jul 2020, 02:05
Ich ignoriere gar nichts denn ich habe nur das gepostet was im Context zu meiner Frage stand.
... sondern darum warum ich keinen Zugriff bekomme.[/QUOTE]

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:
if PRegKey.OpenKey(...

else
  WriteLn(PRegKey.LastErrorMsg); //RaiseLastOSError(PRegKey.LastError);
Ich bekomme da erstmal das Wichtigste bei raus.
* 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:
Es geht nicht darum ob ich einen Key schließe (was ich natürlich tue)
Nein, du machst es nicht immer.
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.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu ( 5. Jul 2020 um 02:35 Uhr)
  Mit Zitat antworten Zitat
venice2
(Gast)

n/a Beiträge
 
#20

AW: Zugriff auf Classes\CLSID

  Alt 5. Jul 2020, 08:30
Zitat:
Und ja, bei mir wird das Verzeichnis problemlos ausgelesen
Ja mit meinem Exe Example auch sowie mit dem vom Uwe.
Zitat:
Entweder du willst wissen warum es nicht geht oder nicht, aber wenn nicht, dann heul nicht rum.
Ok du hast ja recht werde PRegKey.LastErrorMsg in meiner DLL mal anhängen.

Das ergebniss.
Delphi-Quellcode:
            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;
Das System kann die angegebene Datei nicht finden. (wenn aus der DLL aufgerufen)
Seltsam. Was für eine Datei?

Geändert von venice2 ( 5. Jul 2020 um 08:52 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 4     12 34      


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 20:40 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz