Delphi6下面的DCOM问题
procedure TVT.InvokeEvent(DispID: TDispID; var Params: TVariantArray);
begin
case DispID of
-1: Exit; // DISPID_UNKNOWN
1: if Assigned(FOnData) then
FOnData(Self, Params[3] {const WideString}, Params[2] {WordBool}, Params[1] {WordBool}, Params[0] {Integer});
2: if Assigned(FOnError) then
FOnError(Self, Params[0] {const WideString});
end; {case DispID}
end;
这是Delphi6中注册了一个我的AutoObject后自动生成的。
FOnData(Self, Params[3] {const WideString}, Params[2] {WordBool}, Params[1] {WordBool}, Params[0] {Integer});
这一句的参数是Self,Param[3],2,1,0
我客户端使用了我生成的控件的事件实际得到的参数却应当是Param[0],1,2,3
procedure TFrmMain.VT1Data(Sender: TObject; MissionID: Integer;
ProcSuccess, IsMyRequest: WordBool; var DevID: OleVariant);
这样事件procedure TFrmMain.VT1Data一触发就报错。因为MissionID被系统赋值为
DevID的值了。只有手动把它改成
FOnData(Self, Params[0] {const WideString}, Params[1] {WordBool}, Params[2] {WordBool}, Params[3] {Integer});
才能正常使用。
下面是我的DCOM的服务器端的程序自动生成的代码:
IVTEvents = dispinterface
['{DF2F1A58-B427-430B-BE42-A28B95F5D9B5}']
procedure OnData(MissionID: Integer; ProcSuccess: WordBool; IsMyRequest: WordBool;
const DevID: WideString); dispid 1;
procedure OnError(const AError: WideString); dispid 2;
end;
服务器端对事件的调用:
procedure TVT.ReturnBack(DevID: String; MissionID: Integer; ProcSuccess: Boolean; IsMyMission: Boolean);
begin
FEvents.OnData(MissionID, ProcSuccess, IsMyMission, DevID);
end;