Einzelnen Beitrag anzeigen

venice2
(Gast)

n/a Beiträge
 
#18

AW: Zugriff auf Classes\CLSID

  Alt 4. Jul 2020, 23: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 ( 4. Jul 2020 um 23:50 Uhr)
  Mit Zitat antworten Zitat