delphi - 查询 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 位代码编译的。
解决方案
推荐阅读
- php - MySQL LIKE 语句返回奇数结果
- python-3.x - 如何修改此插件以使用 mp3 标签而不是 lrc 文件?
- keras - 具有学习词嵌入、LSTM、Keras 的命名实体识别
- c# - 如何修复“短语”不能为空字符串。参数名称:词组'?
- r - geom_map fill = 变量将每个值拆分为单独的颜色而不是渐变
- angular - 创建已弃用:从 v5 开始使用新签名 Injector.create(options)(弃用)
- python - 查找不包含特定数字的最长序列
- c# - 如何从 Google 登录令牌 WebApi 核心读取用户信息
- android - Android studio jarsigner:与密钥关联的密钥不是私钥
- php - 检查数组是否在php中具有除null以外的值的最佳方法是什么?