Autor Beitrag
fero
Hält's aus hier
Beiträge: 14

WinXP, Vista
D5, D7, D2005 PE
BeitragVerfasst: Di 06.03.07 14:02 
Hi,

ich habe eine DLL geschrieben, die einen eigenen DragDropHandler implementiert. D.h. wenn ich mit der rechten Maustaste eine Datei per Drag & Drop in einen Ordner ziehe, erscheint ein von mir erstellter Kontextmenü-Eintrag, der sich auch problemlos ausführen lässt.
Mein Problem ist, dass Windows meine DLL beim ersten Verwenden in den Speicher lädt und nicht mehr freigibt. Wenn ich also meine kompilierte DLL testen will, klappt es beim ersten Mal gut. Wenn ich sie danach erneut kompilieren will, kann die Ausgabedatei nicht neu erstellt werden, weil sie noch in Verwendung ist. Wie kann ich Windows klarmachen, dass es die DLL nach der Verwendung wieder freigeben soll. (Ist meine erste echte DLL, seid also bitte etwas nachsichtig mit mir ;))
Ich exportiere ja DllCanUnloadNow. Die Funktion ist aber nirgends definiert. Ich habe viel Quellcode aus einem Beispiel ohne detaillierte Erklärung abgeschrieben, deshalb weiß ich nicht genau, ob das mein Problem ist und - falls ja - wie ich damit arbeiten kann.

Hat jemand einen Tipp für mich?

Vielen Dank im Voraus.

Gruß -- Andy aka fero

P.S.: Das hier ist meine Projektdatei:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
uses
  SysUtils,
  Classes,
  ComServ,
  ComObj,
  UDragDropHook in 'UDragDropHook.pas';

{$R *.res}

exports
  DllGetClassObject,
  DllCanUnloadNow,
  DllRegisterServer,
  DllUnregisterServer;

begin

end.


In der Unit UDragDropHook steht u.a. folgender Code:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
(...)

type
  TDragDropHook = class(TComObject, IShellExtInit, IContextMenu)

(...)

const
  Class_DragDropHook: TGUID = '{FFFFF0E3-C65C-9A45-AF7F-815033B870EE}';

(...)

initialization
  TComObjectFactory.Create(ComServer, TDragDropHook, Class_DragDropHook, '',
      'Drag&Drop Shell Extension', ciMultiInstance, tmApartment);