So, hier mal mein bisheriger Versuch. Ich wollte nicht gleich einen A***h voll Rohlinge für Tests verbraten, daher habe ich mir den "einfachsten" EventHandler vorgenommen.
Delphi-Quellcode:
type
ICookie = interface
['{595032D1-92D4-4001-AB44-F40A6A9F16F3}']
function GetCookie: integer;
procedure SetCookie(const Value: integer);
property Cookie: integer read GetCookie write SetCookie;
end;
TDiscMasterEvents = class(TInterfacedObject, DDiscMaster2Events, ICookie)
private
FTypeLib: ITypeLib;
FTypeInfo: ITypeInfo;
FCookie: integer;
public
constructor Create;
function GetTypeInfoCount(out Count: Integer): HResult; stdcall;
function GetTypeInfo(Index, LocaleID: Integer; out TypeInfo): HResult; stdcall;
function GetIDsOfNames(const IID: TGUID; Names: Pointer;
NameCount, LocaleID: Integer; DispIDs: Pointer): HResult; stdcall;
function Invoke(DispID: Integer; const IID: TGUID; LocaleID: Integer;
Flags: Word; var Params; VarResult, ExcepInfo, ArgErr: Pointer): HResult; stdcall;
function NotifyDeviceAdded(const object_: IDispatch; const uniqueId: WideString): HResult; stdcall;
function NotifyDeviceRemoved(const object_: IDispatch; const uniqueId: WideString): HResult; stdcall;
function GetCookie: integer;
procedure SetCookie(const Value: integer);
end;
...
constructor TDiscMasterEvents.Create;
begin
inherited Create;
if LoadRegTypeLib(LIBID_IMAPI2, IMAPI2MajorVersion, IMAPI2MinorVersion,
LOCALE_SYSTEM_DEFAULT, FTypeLib) = S_OK then
FTypeLib.GetTypeInfoOfGuid(IID_DDiscMaster2Events, FTypeInfo);
end;
function TDiscMasterEvents.GetCookie: integer;
begin
Result := FCookie;
end;
function TDiscMasterEvents.GetIDsOfNames(const IID: TGUID; Names: Pointer;
NameCount, LocaleID: Integer; DispIDs: Pointer): HResult;
begin
Result := DispGetIDsOfNames(FTypeInfo, Names, NameCount, DispIDs);
end;
function TDiscMasterEvents.GetTypeInfo(Index, LocaleID: Integer;
out TypeInfo): HResult;
begin
ITypeInfo(TypeInfo) := nil;
if Index <> 0 then
Result := DISP_E_BADINDEX
else
begin
FTypeInfo._AddRef;
ITypeInfo(TypeInfo) := FTypeInfo;
Result := S_OK;
end;
end;
function TDiscMasterEvents.GetTypeInfoCount(out Count: Integer): HResult;
begin
Count := 1;
Result := S_OK;
end;
function TDiscMasterEvents.Invoke(DispID: Integer; const IID: TGUID;
LocaleID: Integer; Flags: Word; var Params; VarResult, ExcepInfo,
ArgErr: Pointer): HResult;
begin
Result := DispInvoke(self,
FTypeInfo,
DispID,
Flags,
TDispParams(Params),
VarResult,
ExcepInfo,
ArgErr);
end;
function TDiscMasterEvents.NotifyDeviceAdded(const object_: IDispatch;
const uniqueId: WideString): HResult;
begin
//Nur mal zum Testen
ShowMessage(uniqueId);
Result := S_OK;
end;
function TDiscMasterEvents.NotifyDeviceRemoved(const object_: IDispatch;
const uniqueId: WideString): HResult;
begin
//Nur mal zum Testen
ShowMessage(uniqueId);
Result := S_OK;
end;
procedure TDiscMasterEvents.SetCookie(const Value: integer);
begin
FCookie := Value;
end;
...
constructor TDiscBurner.Create;
var
lCookie: integer;
begin
inherited Create;
...
FDiscMaster := CoMsftDiscMaster2.Create;
FDiscMasterEvents := TDiscMasterEvents.Create;
InterfaceConnect(FDiscMaster, IID_DDiscMaster2Events, FDiscMasterEvents,
lCookie);
(FDiscMasterEvents as ICookie).Cookie := lCookie;
...
end;
Als Cookie (Verbindungskennung) bekomme ich eine 1 zurück, das scheint also funktioniert zu haben. Allerdings scheint es mir, dass ich mich doch nicht verlesen bzw. die Beschreibung falsch verstanden habe:
Zitat:
NotifyDeviceAdded
Receives notification when an optical media device is added to the computer.
Media Device? Das soll also heißen, dass das Event gefeuert wird, wenn ein
Laufwerk hinzugefügt wird und nicht bloß ein Medium eingelegt? Sollte ich das aber falsch verstanden haben, funktioniert mein Code nicht, das Event wird nicht gefeuert. Ich muss dann wohl doch in den sauren Apfel beißen und es mit einem anderen EventHandler versuchen, aber ich fahre morgen erst einmal zum CodeCamp, komme also frühestens Freitag dazu.