Delphi6在import type library时会把事件参数得顺序写反,导致触发事件是参数顺序示是反的,是bug?(50分)

  • 主题发起人 主题发起人 leaf_fall
  • 开始时间 开始时间
L

leaf_fall

Unregistered / Unconfirmed
GUEST, unregistred user!
Delphi6在import type library时会把事件参数得顺序写反,导致触发事件是参数顺序示是反的。
而在delphi5中引入就是对的。
举个例子,引入ado2.7时,在delphi5中看,adodb_tlb.pas中得TRecordset.InvokeEvent参数顺序是对的。
procedure TRecordset.InvokeEvent(DispID: TDispID; var Params: TVariantArray);
begin
case DispID of
-1: Exit; // DISPID_UNKNOWN
[red]9: if Assigned(FOnWillChangeField) then
FOnWillChangeField(Self, Params[0] {Integer}, Params[1] {OleVariant}, Params[2] {var EventStatusEnum}, Params[3] {const _Recordset});[/red] 。。。。
end; {case DispID}
end;
而在delphi6中引入时,看到的确实反得
procedure TRecordset.InvokeEvent(DispID: TDispID; var Params: TVariantArray);
begin
case DispID of
-1: Exit; // DISPID_UNKNOWN
[red]9: if Assigned(FOnWillChangeField) then
FOnWillChangeField(Self, Params[3] {const Recordset15}, Params[2] {var EventStatusEnum}, Params[1] {OleVariant}, Params[0] {Integer});[/red] 。。。。
end; {case DispID}
end;
实际测试结果也是反的,是delphi6的bug?

我这边手头没有delphi7,有的人帮我试试看,delphi7里是不是也是反得?
 
d7正常
procedure TRecordset.InvokeEvent(DispID: TDispID; var Params: TVariantArray);
begin
case DispID of
-1: Exit; // DISPID_UNKNOWN
9: if Assigned(FOnWillChangeField) then
FOnWillChangeField(Self,
Params[0] {Integer},
Params[1] {OleVariant},
EventStatusEnum((TVarData(Params[2]).VPointer)^) {var EventStatusEnum},
IUnknown(TVarData(Params[3]).VPointer) as _Recordset {const _Recordset});
10: if Assigned(FOnFieldChangeComplete) then
FOnFieldChangeComplete(Self,
Params[0] {Integer},
Params[1] {OleVariant},
IUnknown(TVarData(Params[2]).VPointer) as Error {const Error},
EventStatusEnum((TVarData(Params[3]).VPointer)^) {var EventStatusEnum},
IUnknown(TVarData(Params[4]).VPointer) as _Recordset {const _Recordset});
11: if Assigned(FOnWillChangeRecord) then
 
问题出在Invoke方法上,当从类型库中引出接口声明时,
delphi包装的对象中的Invoke方法将各个方法的传递参数写反了,
只要将它反过来就好了
 
那么说来真是delphi6的一个大bug咯。可有补丁啊
 
上borland网站下个sp2试一下不就知道了
 
接受答案了.
 
后退
顶部