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