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 ponownie

Czy to daje komuś inne pomysły?

questionAnswers(4)

yourAnswerToTheQuestion