Delphi iOS MultipeerConnectivity邀请处理程序导致访问冲突

7dl7o3gd  于 2022-11-04  发布在  iOS
关注(0)|答案(1)|浏览(198)

我正在尝试让MultiPeerConnectivity-Framework在 Delphi 中工作。一切都工作正常,直到我需要调用MCNearbyServiceAdvertiserDelegate中的invitationHandler。

procedure TMCNearbyServiceAdvertiserDelegate.advertiser(advertiser: MCNearbyServiceAdvertiser;
 didReceiveInvitationFromPeer: MCPeerID; withContext: NSData;
 invitationHandler: TMCNearbyServiceAdvertiserDelegateBlockMethod1);

对等方正在相互查找并交换发现信息。“客户端”使用MCNearbyServiceBrowser连接到“服务器”中的MCNearbyServiceAdvertiser。
调用invitationHandler-BlockMethod时,会引发访问冲突:(
现在我已经尝试使用方法imp_implementationWithBlock来获取处理程序的代码:

procedure TMCNearbyServiceAdvertiserDelegate.advertiser(advertiser: MCNearbyServiceAdvertiser;
  didReceiveInvitationFromPeer: MCPeerID; withContext: NSData;
  invitationHandler: TMCNearbyServiceAdvertiserDelegateBlockMethod1);
var
  MainForm: TMainForm;

  aImp: procedure(accept: Boolean; session: MCSession); cdecl;
begin
  MainForm := application.MainForm as TMainForm;

  if MainForm.fSession = nil then
  begin
    MainForm.fSession := TMCSession.Alloc;
    MainForm.fSession.initWithPeer(MainForm.fPeerId);
    MainForm.fSessionDelegate := TMCSessionDelegate.Create;
    MainForm.fSession.setDelegate(MainForm.fSessionDelegate.GetObjectID);
  end; 

  @aImp := imp_implementationWithBlock(invitationHandler);
  aImp(True, MainForm.fSession);
  imp_removeBlock(@aImp);
end;

但是使用这种方法,我会得到一个错误,因为我猜invitationHandler不是指针。
来自Kastri的iOSApi.MultiPeerConnectivity.pas中的TMCNearbyServiceAdvertiserDelegateBlockMethod 1的定义:

TMCNearbyServiceAdvertiserDelegateBlockMethod1 = procedure(accept: Boolean; session: MCSession) of object;

我希望这不是太多的信息一次。任何帮助调用该invitationHandler的正确方式将非常感谢!

zengzsys

zengzsys1#

终于 解决 了 !
我 在 Delphi 的 System.Net.HttpClient.Mac 单元 中 发现 了 一 个 类似 的 情况 , 在 TMacConnectionDataDelegate.URLSessionTaskDidReceiveChallengeCompletionHandler 方法 中 。 块 处理 程序 需要 包含 第 二 个 声明 为 Pointer 的 参数 。 我 不 记得 为什么 这样 做 , 我 只 知道 它 是 有效 的 : - ) session 参数 也 需要 是 Pointer , 并 使用 NSObjectToID 方法 将 您 的 引用 转换 为 该 参数 的 指针 。
根据 我 在 问题 中 的 评论 , 您 需要 在 委托 接口 和 实现 中将 块 方法 类型 更改 为 Pointer ( 而 不是 TMCNearbyServiceAdvertiserDelegateBlockMethod1 ) , 并 如上 所 述 声明 块 处理 程序 方法 , 因此 这 应该 对 您 有效 :

procedure TMCNearbyServiceAdvertiserDelegate.advertiser(advertiser: MCNearbyServiceAdvertiser;
  didReceiveInvitationFromPeer: MCPeerID; withContext: NSData;
  invitationHandler: Pointer);
var
  MainForm: TMainForm;

  aImp: procedure(accept: Boolean; ignored: Pointer; session: Pointer); cdecl;
begin
  MainForm := application.MainForm as TMainForm;

  if MainForm.fSession = nil then
  begin
    MainForm.fSession := TMCSession.Alloc;
    MainForm.fSession.initWithPeer(MainForm.fPeerId);
    MainForm.fSessionDelegate := TMCSessionDelegate.Create;
    MainForm.fSession.setDelegate(MainForm.fSessionDelegate.GetObjectID);
  end; 

  @aImp := imp_implementationWithBlock(invitationHandler);
  aImp(True, nil, NSObjectToID(MainForm.fSession));
  imp_removeBlock(@aImp);
end;

中 的 每 一 个

相关问题