Delphi-PRAXiS
Seite 2 von 4     12 34      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Zugriff auf Classes\CLSID (https://www.delphipraxis.net/204836-zugriff-auf-classes%5Cclsid.html)

Uwe Raabe 4. Jul 2020 22:08

AW: Zugriff auf Classes\CLSID
 
Zitat:

Zitat von venice2 (Beitrag 1468852)
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.

venice2 4. Jul 2020 22:13

AW: Zugriff auf Classes\CLSID
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1468853)
Zitat:

Zitat von venice2 (Beitrag 1468852)
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.

Uwe Raabe 4. Jul 2020 22:13

AW: Zugriff auf Classes\CLSID
 
Hast du es mal aus einem simplen Testprogramm heraus versucht?

venice2 4. Jul 2020 22:14

AW: Zugriff auf Classes\CLSID
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1468855)
Hast du es mal aus einem simplen Testprogramm heraus versucht?

Könnte ich mal machen.

Uwe Raabe 4. Jul 2020 22:16

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.

venice2 4. Jul 2020 22:21

AW: Zugriff auf Classes\CLSID
 
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.

Uwe Raabe 4. Jul 2020 23:11

AW: Zugriff auf Classes\CLSID
 
Zitat:

Zitat von venice2 (Beitrag 1468858)
Einfache EXE funktioniert aus DLL der gleiche Code nicht.

Auch nicht mit einer neuen, sonst nackten DLL nicht?

Zitat:

Zitat von venice2 (Beitrag 1468858)
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.

venice2 4. Jul 2020 23:12

AW: Zugriff auf Classes\CLSID
 
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. :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.

himitsu 5. Jul 2020 01:05

AW: Zugriff auf Classes\CLSID
 
Zitat:

Zitat von venice2 (Beitrag 1468849)
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.

venice2 5. Jul 2020 07:30

AW: Zugriff auf Classes\CLSID
 
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?


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:04 Uhr.
Seite 2 von 4     12 34      

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