我正在尝试实现在 OSX 上宣布 Bonjour 服务的代码。开箱即用,没有直接的方法可以做到这一点。
有Macapi.Foundation
以下接口:NSNetServiceClass
和NSNetService
。然后是包装类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;