Kod ZeroConf / Bonjour działający w Delphi 7 nie działa w 2009 roku
Mam następującą deklarację dla 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;
W moim frameworku Bonjour mam następującą odpowiedź na ogłoszoną usługę, która jest aktywna (tj. Aby faktycznie ogłosić się za pośrednictwem 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;
To jest bardziej gadatliwe, niż sądzę, że musi być bezwzględnie, na pewno działało doskonale w Delphi 7 w znacznie mniejszej formie. Rozszerzyłem wiele operacji na wyraźne kroki, aby ułatwić debugowanie, np. być w stanie zidentyfikować wszelkie niejawne transformacje ładunków łańcuchowych, które mogą występować „pod maską” w Delphi 2009.
Nawet w tej nieporządnej rozwiniętej formie kod ten kompiluje się i działa doskonale w Delphi 7, ale jeśli skompiluję i uruchomię z Delphi 2009, nie otrzymam powiadomienia o mojej usłudze.
Na przykład, jeśli uruchomię ten kod jako część aplikacji Delphi 7, aby zarejestrować_daap._tcp
usługa (biblioteka współdzielona z iTunes) Widzę ją wyskakującą w uruchomionym wystąpieniu iTunes. Jeśli zrekompiluję dokładnie tę samą aplikację bez modyfikacji w Delphi 2009 i uruchomię ją, robię tonie zobacz moją usługę pojawiającą się w iTunes.
Mam takie samo zachowanie podczas monitorowania za pomocądns-sd narzędzie linii poleceń. Oznacza to, że kod usługi skompilowany z Delphi 7 zachowuje się tak, jak się tego spodziewam, skompilowany w Delphi 2009 - nic.
nie dostajękażdy błędy z API Bonjour -DNSServiceRegisterReply wywołanie zwrotne jest wywoływane z kodem błędu 0 (zero), tj. powodzeniem, a jeśli podam parametr nazwy NIL z automatyczną nazwą określoną w flagach, to moja usługa ma poprawną nazwę domyślną. Ale nadal usługa nie pojawia się w iTunes.
Nie wiem, co się dzieje.
Jak można się domyślić po rozszerzeniu kodu, ścigałem potencjalne błędy wprowadzane przez implementację Unicode w Delphi 2009, ale wydaje się, że nigdzie nie prowadzi.
Kod został pierwotnie opracowany w wersji 1.0.3 interfejsu API / SDK Bonjour. Od tamtej pory zaktualizowałem do wersji 1.0.6 w przypadku, gdy było to w jakiś sposób zaangażowane, bez powodzenia. afaict 1.0.6 po prostu dodał nową funkcję do uzyskiwania „właściwości”, która obecnie obsługuje tylko właściwość „DaemonVersion” do uzyskania wersji Bonjour - to działa doskonale.
UWAGA: Zdaję sobie sprawę, że w obecnej postaci kod w Delphi 7 nie jest technicznie bezpieczny dla UTF8 - wyeliminowałem jawne konwersje tak dalece, jak to możliwe, aby utrzymać rzeczy tak proste, jak to możliwe, dla automatycznych konwersji, które stosuje Delphi 2009. Moim celem jest teraz praca w Delphi 2009, a następnie praca wstecz z tego rozwiązania, mam nadzieję, że znajdę kompatybilne podejście do wcześniejszych wersji Delphi.
UWAGA TAKŻE: Początkowo miałem również problemy z przeglądaniem reklamowanych usług, tj. Identyfikowaniem rzeczywistej biblioteki współdzielonej iTunes w sieci. Problemy te zostały spowodowane przez obsługę Unicode w Delphi 2009 i zostały rozwiązane. Mój kod Delphi 2009 jest równie zdolny do identyfikacji rzeczywistej biblioteki współdzielonej iTunes i sprawdzania jej rekordów TXT. To tylko ta rejestracja usługi, która nie działa.
Brakuje mi czegoś głupiego i oczywistego.
Czy ktoś ma jakieś pomysły ?!
AKTUALIZACJA
Po powrocie do tego problemu odkryłem teraz:
Jeśli mam pre-D2009 i D2009 + IDE otwarte (np. D2006 i D2010) zpodobnie projekt załadowany do obu IDE jednocześnie:
Zbuduj i uruchom pod 2006: Działa - moje ogłoszenie o usłudze jest odbierane przez iTunesPrzełącz się na D2010 i uruchom (bez budowania): wykonuje minimalną kompilację, działa i działa.Wykonaj pełną kompilację w D2010: przestaje działać
Wróć do D2006 i uruchom (bez budowania): To nie działa
Wykonaj pełną kompilację w D2006: działa ponownieCzy to daje komuś inne pomysły?