Jetzt benötigen wir ein
COM-Objekt, das wir über das Menü "Datei/Neu/
ActiveX/
COM-Objekt" in unsere leere
DLL einfügen. Der tatsächliche Name und die Beschreibung hängt letzten Endes natürlich vom Einsatzzweck ab. Wichtig wäre aber, dass folgende Optionen unverändert übernommen werden:
- Instantiierung = Mehrere Instanzen
- Threading-Model = Apartment
- Typbibliothek einschließen = Ja
- Schnittstelle als OLE-Automation = Ja
(In der Offline-Version dieses Tutorials gibt es einen Screenshot des Dialogs, in dem man die Auswahl noch ein bisschen besser erkennen kann!)
So, damit haben wir den Grundlagen-Code, den wir bei jeder Shell-Erweiterung bitte auf diese Art erzeugen! Ich verweise noch mal auf meinen Satz am Anfang, in dem es um die eindeutigen GUIDs ging. Da wir jetzt diesen Grundlagen-Code mit eindeutigen GUIDs besitzen, können wir nun auch problemlos die benötigten Funktionen aus vorhandenen Shell-Erweiterungen nehmen und für unser jeweils aktuelles Projekt anpassen.
Das Dialogfenster der Typbibliothek können wir im Hintergrund verschwinden lassen. Uns interessiert nur der Code des
COM-Objektes. Zunächst deklarieren wir die
Unit "ShlObj.pas" und ergänzen unser
COM-Objekt wie folgt:
Code:
type
TPSheetTest = class(TTypedComObject, IPSheetTest,
IShellExtInit, IShellPropSheetExt { <- beide Angaben ergänzen})
protected
{IPSheetTest-Methoden hier deklarieren}
end;
Jetzt bekommen wir eine Fehlermeldung beim Kompilieren, weil wir "IShellExtInit" und "IShellPropSheetExt" deklariert, nicht aber deren Eigenschaften benutzt haben. Wir erweitern also:
Code:
protected
function IShellExtInit.Initialize = ShellExtInitialize;
function ShellExtInitialize(pidlFolder: PItemIDList;
lpdobj: IDataObject; hKeyProgID: HKEY): HResult; stdcall;
function AddPages(lpfnAddPage: TFNAddPropSheetPage;
lParam: LPARAM): HResult; stdcall;
function ReplacePage(uPageID: UINT; lpfnReplaceWith: TFNAddPropSheetPage;
lParam: LPARAM): HResult; stdcall;
end;
Ebenfalls ergänzt werden muss die
Unit "CommCtrl", da wir "TFNAddPropSheetPage" benutzt haben, bzw. benutzen müssen.
Eine dieser Funktion (Methoden) wollen wir bereits mit Leben füllen:
Code:
function TPSheetTest.ReplacePage(uPageID: UINT;
lpfnReplaceWith: TFNAddPropSheetPage; lParam: LPARAM): HResult;
begin
Result := E_NOTIMPL; // Dummy
end;
Die wird uns nämlich in unserem Beispiel nicht weiter interessieren. Es ist eine Dummy-Funktion, die wir allerdings deklarieren und mit Code versehen müssen. Andernfalls meckert der Compiler. Nur brauchen wir sie in unserem Beispiel nicht.