零配置/Bonjour工作的代码,在德尔斐7不工作,在2009年
-
18-09-2019 - |
题
我有以下宣言》DNSServiceRegister:
function DNSServiceRegister
(
var sdRef: TDNSServiceRef;
const flags: TDNSServiceFlags;
const interfaceIndex: uint32_t;
const name: PUTF8String; //* may be NULL */
const regType: PUTF8String;
const domain: PUTF8String; //* may be NULL */
const host: PUTF8String; //* may be NULL */
const port: uint16_t;
const txtLen: uint16_t;
const txtRecord: Pointer; //* may be NULL */
const callBack: TDNSServiceRegisterReply; //* may be NULL */
const context: Pointer //* may be NULL */
): TDNSServiceErrorType; stdcall; external DNSSD_DLL;
在我Bonjour框架,我有以下响应宣布服务正在作出了积极的(即实际上开始公布自己,Bonjour):
procedure TAnnouncedService.Activate;
var
flags: Cardinal;
name: UTF8String;
svc: UTF8String;
pn: PUTF8String;
ps: PUTF8String;
begin
fPreAnnouncedServiceName := ServiceName;
inherited;
if AutoRename then
flags := 0
else
flags := kDNSServiceFlagsNoAutoRename; { - do not auto-rename }
if (ServiceName <> '') then
begin
name := ServiceName;
pn := PUTF8String(name);
end
else
pn := NIL;
svc := ServiceType;
ps := PUTF8String(svc);
CheckAPIResult(DNSServiceRegister(fHandle,
flags,
0 { interfaceID - register on all interfaces },
pn,
ps,
NIL { domain - register in all available },
NIL { hostname - use default },
ReverseBytes(Port),
0 { txtLen },
NIL { txtRecord },
DNSServiceRegisterReply,
self));
TBonjourEventHandler.Create(fHandle);
end;
这是更详细的比我想的严格需要,当然这是完全运作以及在德尔斐7在一个更详细的形式。我已经扩大很多操作到明确的步骤,以促进调试,例如能够识别任何隐含的转变的串的有效载荷,可能会发生"引擎盖下"在德尔斐2009年。
即使在这个邋遢的形式扩大这种代码汇编和完美的作品以及在德尔斐7中,但是,如果我汇编和运用特尔斐2009我没有得到任何宣布我的服务。
例如,如果我经营这个代码的一部分,德尔斐7申请注册一个 _daap._tcp
服务(iTunes公共图书馆)我看到它弹在运行实例iTunes。如果我要重新编译本完全相同的申请不作修改在德尔斐2009年和运行它的,我做的 不 看到我的服务出现在iTunes。
我得到的同样的行为时监控 dns-sd 命令行实用工具。也就是说,服务代码汇编有德尔斐7的行为,因为我期望,汇编在特尔斐2009-什么都没有。
我得不到 任何 错误的Bonjour API的 DNSServiceRegisterReply 回被称为与ErrorCode0(zero),即取得成功,并且如果我提供的一个无名参与AutoRename指定的旗帜然后我的服务是分配的正确的默认的名称。但还是服务不出现在iTunes。
我在失去作为到底是怎么回事。
正如你可以告诉,从扩展的代码,我已经追潜在的错误正在介绍的Unicode执行在德尔斐2009年,但这似乎是导致我一事无成。
代码最初是针对版本1.0.3的Bonjour API/SDK。因为我已经更新,以1.0.6的情况下,是以某种方式参与,没有任何成功。afaict1.0.6仅仅增加一个新的功能为取得"属性",目前只支持"DaemonVersion"酒店获得的Bonjour版本-这是工作的完美。
注: 我知道这代码,因为它代表的是在技术上不UTF8安全的,在德尔斐7-我已经消除了明确的转换尽可能以让事情尽可能简单的自动转换,德尔福2009年适用。我的目标就是要获得这种工作在德尔斐2009年的工作向后从该方案希望找到一个兼容的方法的早期版本的德尔菲.
还注意到: 我原本也有问题,浏览公布服务,即确定一个实际的iTunes公共图书馆网络。这些问题引起的Unicode处理在德尔斐2009年已得到解决。我的特尔斐2009年码只是为能够确定一个实际的iTunes公共图书馆和查询这TXT记录。这只是这个服务登记,不工作。
我必须丢失的东西愚蠢的和显而易见的。
没有任何人有任何想法?!
更新
回到这个问题我们现在发现了以下:
如果我有一个预D2009和D2009+IDE开(e。g D2006和D2010)与 同 项目载入这两个IDE的同时:
- 建立和运行在2006年:它的工作-我的服务通告是由iTunes
- 切换到D2010和运行(不含大楼):它没有一个最小的编制、运行和工作。
做一个完整的建立中D2010:它停止工作
切换回D2006和运行(不含大楼):它不工作
- 做一个完整的建立中D2006:它再次工作
这不会给任何人任何其他想法吗?
解决方案
在回答这是令人难以置信。一方面,我做了一个完全愚蠢,非常简单的错误,但在另一方面,它应当永远作为我们看到曾在任何版本的德尔菲!
问题是什么什么那么做的Unicode/非unicodeness的任何条件,但实际上是由于一种类型的不匹配的口参数。
我是传递的结果 ReverseBytes(港口) -参数预计一个 uint16_t, 即一个 字 值。我 口 酒店但是宣称(懒洋洋地)作为一个 整数!!
一旦我解决了这个问题,已 口 宣布为 字, 它现在工作的两D2007和D2009版本的德尔菲.
非常奇怪的。
我只能认为其他一些边缘的情况下行为的编译器,可能必须以某种方式影响该是改变的时候Unicode支持。
其他提示
根据该信息,我们可以在这里,情况是这样的:
- 打电话时DLL用你的代码,在德尔斐2007年,它提供了一个结果。
- 打电话时一样DLL用你的代码,在德尔斐2009年,它提供了另一个结果。
- 所怀疑的是,它是有关的特尔斐2009年编译器。
从逻辑上讲,差,因此必须的,即德尔福2009年发送不同的价值观作为参数。为了使调试真正的德尔菲独立的,因此需要创建一个虚拟的问题,其报告的价值观。其他德尔福依赖的方法可以应用,如在寻找拆卸的功能呼叫到DLL和调试,它使我们确切地知道什么价值,和如何,该问题,在这两个编译器。
我找不到该宣言指令的增值"服务名称"和"服务类型"在你的代码样本。
假设一串的类型(因此unicode string),我猜(是的...没有D2009可以测试这一)懒惰的转换可能是一个问题:
name := ServiceName;
为什么不使用以下?
name := PAnsiChar(AnsiString(ServiceName))
无论如何...只是我的2cts。
顺便说一句:我一直使用的预先定义的"EmptyStr", "EmptyWideStr"...所以测试看起来就像:
if (ServiceName <> EmptyStr) then
这应该是安全和避免混乱的类型。
在其他方面,德尔斐可以解释"作为一个ANSIChar如下宣言:
const
MyParagraphChar = '§';
不知道...我很困惑-应该回家,现在)
如果DLL没有书面使用德尔菲2009年,您可能想要使用别的东西比PUTF8String.德尔福2009年Utf8String类型是不同的,从德尔福2007年的UTF8String类型。
如果DLL写使用C++,我强烈建议使用PAnsiChar()而不是PUtf8String.