0

我正在尝试实现在 OSX 上宣布 Bonjour 服务的代码。开箱即用,没有直接的方法可以做到这一点。

Macapi.Foundation以下接口:NSNetServiceClassNSNetService。然后是包装类TNSNetService。这些是应该让我宣布服务的接口和类。

在我的课堂TsdBonjourAnnouncerMac上,我有一个activate()宣布服务的方法。我遵循与创建 Bonjour 侦听器相同的代码模板,效果很好。但是,此代码崩溃。

这行代码INetService := TNSNetService.Wrap(TNSNetService.OCClass.alloc);引发了访问冲突。 TNSNetService.OCClass.alloc是罪犯。

我不知道如何解决这个问题。

我发现了这个:直接从 Delphi 使用 OS X API。它显示了一个稍微不同的过程。我尝试使用它,但无法调用任何方法,NSNetService因为它们不是类方法。

我怎样才能让它工作?

      NSNetServiceClass = interface(NSObjectClass)
        ['{450D03AC-1380-44BA-B4C3-2D30DACACA43}']
        {class} function dataFromTXTRecordDictionary(txtDictionary: NSDictionary): NSData; cdecl;
        {class} function dictionaryFromTXTRecordData(txtData: NSData): NSDictionary; cdecl;
      end;
      NSNetService = interface(NSObject)
        ['{8FACC18E-5DFA-4526-A256-DBD7CF74B65C}']
        function TXTRecordData: NSData; cdecl;
        function addresses: NSArray; cdecl;
        function delegate: NSNetServiceDelegate; cdecl;
        function domain: NSString; cdecl;
        function getInputStream(inputStream: NSInputStream; outputStream: NSOutputStream): Boolean; cdecl;
        function hostName: NSString; cdecl;
        function name: NSString; cdecl;
        function port: NSInteger; cdecl;
        function protocolSpecificInformation: NSString; cdecl;
        procedure publish; cdecl;
        procedure publishWithOptions(options: NSNetServiceOptions); cdecl;
        procedure removeFromRunLoop(aRunLoop: NSRunLoop; forMode: NSString); cdecl;
        procedure resolve; cdecl;
        procedure resolveWithTimeout(timeout: NSTimeInterval); cdecl;
        procedure scheduleInRunLoop(aRunLoop: NSRunLoop; forMode: NSString); cdecl;
        procedure setDelegate(delegate: NSNetServiceDelegate); cdecl;
        procedure setProtocolSpecificInformation(specificInformation: NSString); cdecl;
        function setTXTRecordData(recordData: NSData): Boolean; cdecl;
        procedure startMonitoring; cdecl;
        procedure stop; cdecl;
        procedure stopMonitoring; cdecl;
      end;
      TNSNetService = class(TOCGenericImport<NSNetServiceClass, NSNetService>)  end;

 //****************************************************************************//

    TsdBonjourAnnouncerMac = class(TsdBonjourAnnouncerBase)
    private
        IDelegate:   NSNetServiceDelegate;
        INetService: NSNetService;
    protected
        function  Activate: Boolean; override;
        procedure DeActivate; override;
    public
    end;

function TsdBonjourAnnouncerMac.Activate: Boolean;
begin
    inherited;
    
    Result := True;
    INetService := TNSNetService.Wrap(TNSNetService.OCClass.alloc); // Raises access violation

    // More code to initialize

    // Set the delegate 
    
    IDelegate := TsdServiceDelegate.Create;
    
    INetService.setDelegate(NSNetServiceDelegate((IDelegate as ILocalObject).GetObjectID));
    INetService.publish;
end;
    
procedure TsdBonjourAnnouncerMac.DeActivate;
begin
end;
4

0 回答 0