Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Ist COM-DLL im System eingebunden (registriert)? (https://www.delphipraxis.net/85349-ist-com-dll-im-system-eingebunden-registriert.html)

blackdrake 29. Jan 2007 16:58


Ist COM-DLL im System eingebunden (registriert)?
 
Hallo.

Ich habe eine DLL, die einen Kontextmenüeintrag setzt, über eine Delphi-Funktion (die RegSvr32 ersetzt) aus der CodeLib erfolgreich eingebunden und möchte nun aber auch abfragen, ob die DLL registriert bzw gestartet ist. Wie kann ich das in Delphi tun?

Gruß
blackdrake

Delphi-Quellcode:
uses
  ActiveX;

begin
  CoInitialize (nil);

  try
    RegisterServer(extractfilepath(application.exename)+'MeineDLL.dll');
  finally
    CoUninitialize;
  end;
end;

shmia 29. Jan 2007 17:10

Re: Ist COM-DLL im System eingebunden (registriert)?
 
Am Einfachsten prüfst du, ob eine CoClass registriert ist:
Delphi-Quellcode:
function ProgIDExists(const ProgID:WideString):Boolean;
var
   tmp : TGUID;
begin
   Result := Succeeded(CLSIDFromProgID(PWideChar(ProgID), tmp));
end;

if ProgIDExists('MeineDLL.Plugin') then ...

blackdrake 29. Jan 2007 17:26

Re: Ist COM-DLL im System eingebunden (registriert)?
 
Hallo.

Danke für die Antwort. Leider funktioniert es nicht. Ich habe es schon mit "MeineDLL.dll" und "MeineDLL.dll.Plugin" probiert. Eine DLL namens MeineDLL.dll ist mit RegSvr32.exe registriert worden und der Kontextmenüeintrag existiert.

Es handelt sich um eine DLL, die eine GUID hat und über TComObject einen Kontextmenüeintrag erstellt (aus einer Codevorlage erstellt).

Gruß
blackdrake

shmia 29. Jan 2007 17:43

Re: Ist COM-DLL im System eingebunden (registriert)?
 
Zitat:

Zitat von blackdrake
Leider funktioniert es nicht. Ich habe es schon mit "MeineDLL.dll" und "MeineDLL.dll.Plugin" probiert. Eine DLL namens MeineDLL.dll ist mit RegSvr32.exe registriert worden und der Kontextmenüeintrag existiert.

Es kommt hier auf jedes Zeichen an; raten bringt da nichts.
Der als ProgID zu übergebene String besteht aus 2 Teilen: "Libraryname.CoClassname"
Lass dir mal die TLB in Delphi anzeigen.
Der Text ganz oben an der Wurzel (Symbol 3 kleine blaue Rauten) ist der "Libraryname".
Es gibt nun mindestens eine CoClass.
Man erkennt sie an dem Symbol "rote Kugel springt aus blauem Karton".

Beispiel:
http://info.borland.com/techpubs/del...s/typlibed.gif
die ProgID wäre also "TypeLib1.cyc"

blackdrake 29. Jan 2007 17:49

Re: Ist COM-DLL im System eingebunden (registriert)?
 
Hallo. Ich hab leider keine Ahnung von was du redest :( Ich habe bei meiner Kontextmenü-DLL keine TLB.

Meine DLL besteht nur aus einer PAS und sieht so aus:

Delphi-Quellcode:
unit ShellExtMain;

interface

uses
  ComServ, SysUtils, ShellAPI, Windows, Registry, ActiveX, ComObj, ShlObj,
  Graphics, classes, inifiles;

const
  GUID_TDFKontextMenuShellExt: TGUID = '{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}';

type
  TDFKontextMenuShellExt = class(TComObject, IShellExtInit, IContextMenu)
    protected
      function IShellExtInit.Initialize = SEInitialize;
      function SEInitialize(pidlFolder: PItemIDList; lpdobj: IDataObject; hKeyProgID: HKEY): HResult; stdcall;
      function QueryContextMenu(Menu: HMENU; indexMenu, idCmdFirst, idCmdLast, uflags: UINT): HResult; stdcall;
      function InvokeCommand(var lpici: TCMInvokeCommandInfo): HResult; stdcall;
      function GetCommandString(idCmd, uType: UINT; pwReserved: PUINT; pszName: LPSTR; cchMax: UINT): HResult; stdcall;
  end;

(...)

initialization
  // Initialisierung
  TDFKontextMenuShellExtFactory.Create(ComServer, TDFKontextMenuShellExt, GUID_TDFKontextMenuShellExt,
    '', 'Programmname', ciMultiInstance, tmApartment);
  (...)
end.


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:35 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