Ziel: COM-Automationsobjekt mit Events entwicklen, wobei das Event-Interface eine Interface-Methode mit mehreren Parametern nutzt
<pre>
IMultiParamD6TestObjEvents = dispinterface
['{370585E9-44A9-472C-95FD-C6632FBC9128}']
procedure OnWork(const sMsg: WideString; iValue: Integer); dispid 1;
end;
</pre>
Von diesem COM-Objekt wird über <i>Projekt | Typbibliothek importieren</i> eine VCL-Wrapperkomponente generiert.
Ergebnis in <b>Delphi 5</b>: OK
<pre>
procedure TMultParamObj.InvokeEvent(DispID: TDispID; var Params: TVariantArray);
begin
case DispID of
-1: Exit; // DISPID_UNKNOWN
1: if Assigned(FOnWork) then
FOnWork(Self, Params[0] {const WideString}, Params[1] {Integer});
end; {case DispID}
end;
</pre>
Ergebnis in <b>Delphi 6.01</b>: <b> Parameter-Reihenfolge bei FOnWork ist falsch</b>
<pre>
procedure TMultiParamD6TestObj.InvokeEvent(DispID: TDispID; var Params: TVariantArray);
begin
case DispID of
-1: Exit; // DISPID_UNKNOWN
1: if Assigned(FOnWork) then
FOnWork(Self, Params[1] {Integer}, Params[0] {const WideString});
end; {case DispID}
end;
</pre>
Workaround: Die von Delphi automatisch generierte Import-Unit von Hand ändern.
<pre>
IMultiParamD6TestObjEvents = dispinterface
['{370585E9-44A9-472C-95FD-C6632FBC9128}']
procedure OnWork(const sMsg: WideString; iValue: Integer); dispid 1;
end;
</pre>
Von diesem COM-Objekt wird über <i>Projekt | Typbibliothek importieren</i> eine VCL-Wrapperkomponente generiert.
Ergebnis in <b>Delphi 5</b>: OK
<pre>
procedure TMultParamObj.InvokeEvent(DispID: TDispID; var Params: TVariantArray);
begin
case DispID of
-1: Exit; // DISPID_UNKNOWN
1: if Assigned(FOnWork) then
FOnWork(Self, Params[0] {const WideString}, Params[1] {Integer});
end; {case DispID}
end;
</pre>
Ergebnis in <b>Delphi 6.01</b>: <b> Parameter-Reihenfolge bei FOnWork ist falsch</b>
<pre>
procedure TMultiParamD6TestObj.InvokeEvent(DispID: TDispID; var Params: TVariantArray);
begin
case DispID of
-1: Exit; // DISPID_UNKNOWN
1: if Assigned(FOnWork) then
FOnWork(Self, Params[1] {Integer}, Params[0] {const WideString});
end; {case DispID}
end;
</pre>
Workaround: Die von Delphi automatisch generierte Import-Unit von Hand ändern.