首页 > 解决方案 > 查询 IConnectionPointContainer 会导致崩溃

问题描述

我已经根据 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 位代码编译的。

标签: delphiserverautomationconnectionpoints

解决方案


推荐阅读