查询IConnectionPointContainer会导致崩溃

时间:2019-07-12 14:48:40

标签: delphi server automation connection points

我已经根据Eric Harmon Delphi COM编程手册中的代码在Delphi XE7中实现了自动化服务器,但是我无法使COM事件在Windows 10上运行。

已为CiMultiInstance设置了自动化服务器,因此一台服务器可用于多个客户端。主类实现IConnectionPointContainer。在Initialize方法中,创建FConnectionPoints,并成功调用FConnectionPoints.CreateConnectionPoint。它还可以成功调用RegisterActiveObject。

在调用服务器方法时它可以正常工作,并且具有事件接口,但是当它尝试将数据发送回客户端时,它将调用GetEnumerator并在QueryInterface(IConnectionPointContainer,Container)调用时掉落。

我已经从提升权限的命令行启动了服务器,但这没有什么区别。

这是课程的第一行:

    TMRILocalProxyServer = class(TAutoObject, IConnectionPointContainer, IMRILocalProxyServer)

IMRILocalProxyServer_TLB包含一个事件并具有组件包装,因此,例如,有一个InvokeEventMethod。

procedure TMRILocalProxyServer.InvokeEvent(DispID: TDispID; var Params: TVariantArray);
begin
  case DispID of
    -1: Exit;  // DISPID_UNKNOWN
    203: if Assigned(FOnReturnData) then
         FOnReturnData(Self, Params[0] {OleVariant});
  end; {case DispID}
end;

在客户端代码中,OnReturnData已分配给方法。

这是Initialize方法的一部分:

  FConnectionPoints := TConnectionPoints.Create(Self);
  if AutoFactory.EventTypeInfo <> nil then
    begin
      FConnectionPoints.CreateConnectionPoint(AutoFactory.EventIID, ckMulti, EventConnect);
      OleCheck(RegisterActiveObject(Self as IUnknown, CLASS_MRILocalProxyServer_, ActiveObject_Weak, FROTCookie))
    end

此代码失败,该函数的第一行代码。

function TMRILocalProxyServer.GetEnumerator: IEnumConnections;
var
  Container : IConnectionPointContainer;
  ConnectionPoint : IConnectionPoint;
begin
  OleCheck(QueryInterface(IConnectionPointContainer,Container));

 OleCheck(Container.FindConnectionPoint(Autofactory.EventIID,ConnectionPoint));
  ConnectionPoint.EnumConnections(Result);
end;

出现的错误是“ ...引发异常类$ C0000005并显示消息” c0000005 ACCESS_VIOLATION”。

查看两个变量,它们显示为00000000,即nil。

最后一件事,这是为64位代码编译的。

0 个答案:

没有答案