Код ZeroConf / Bonjour, который работает в Delphi 7 и не работает в 2009 году

У меня есть следующее объявление для 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;

Это более многословно, чем я думаю, что это строго необходимо, конечно, это работало превосходно в Delphi 7 в гораздо менее многословной форме. Я расширил множество операций в явные шаги для облегчения отладки, например, чтобы иметь возможность идентифицировать любые неявные преобразования строковых полезных данных, которые могут происходить "под капотом" в Delphi 2009

Даже в этой неопрятной развернутой форме этот код компилируется и прекрасно работает в Delphi 7, но если я скомпилирую и запущу с Delphi 2009, я не получу анонс моей службы.

Например, если я запускаю этот код как часть приложения Delphi 7 для регистрации_daap._tcp сервис (совместно используемая библиотека iTunes) Я вижу это всплывающее окно в запущенном экземпляре iTunes. Если я перекомпилирую точно такое же приложение без изменений в Delphi 2009 и запусту его, я сделаюне увидеть мой сервис, появляющийся в iTunes.

Я получаю такое же поведение при мониторинге сDNS-сд утилита командной строки. То есть сервисный код, скомпилированный с Delphi 7, ведет себя так, как я ожидаю, скомпилированный в Delphi 2009 - ничего.

Я не получаюлюбой ошибки из Bonjour API -DNSServiceRegisterReply обратный вызов вызывается с ErrorCode 0 (ноль), то есть успешно, и если я предоставлю параметр NIL name с AutoRename, указанным в флагах, тогда моей службе будет назначено правильное имя по умолчанию. Но служба не отображается в iTunes.

Я в растерянности относительно того, что происходит.

Как вы могли бы сказать из расширения кода, я преследовал потенциальные ошибки, возникающие при реализации Unicode в Delphi 2009, но, похоже, это ни к чему меня не приведет.

Код был изначально разработан для версии 1.0.3 Bonjour API / SDK. Я'с тех пор мы обновили до 1.0.6, если это было каким-то образом связано, но безуспешно afaict 1.0.6 просто добавил новую функцию для получения "свойства», который в настоящее время поддерживает только "DaemonVersion» свойство для получения версии Bonjour - это работает отлично.

ПРИМЕЧАНИЕ: яЯ осознаю, что код в его нынешнем виде не является технически UTF8-безопасным в Delphi 7 - я по возможности исключил явные преобразования, чтобы максимально упростить автоматические преобразования, применяемые в Delphi 2009. Моя цель сейчас состоит в том, чтобы заставить это работать в Delphi 2009, а затем отойти от этого решения, надеясь найти совместимый подход для более ранних версий Delphi.

ПРИМЕЧАНИЕ ТАКЖЕ: Изначально у меня также были проблемы с просмотром рекламируемых сервисов, т. Е. С определением реальной общей библиотеки iTunes в сети. Эти проблемы были вызваны обработкой Unicode в Delphi 2009 и были решены. Мой код Delphi 2009 так же способен идентифицировать реальную разделяемую библиотеку iTunes и запрашивать ее »записи TXT. Это'только эта регистрация службы, которая нет работает.

Я должен упустить что-то глупое и очевидное.

У кого-нибудь есть какие-либо идеи?!

ОБНОВИТЬ

Вернувшись к этой проблеме, я обнаружил следующее:

Если у меня открыт предварительный D2009 и IDE D2009 + (например, D2006 и D2010) стак же Проект загружен в оба IDEс одновременно:

Сборка и запуск под 2006: это работает - мое сервисное объявление забрано iTunesПереключитесь на D2010 и запустите (без сборки): он выполняет минимальную компиляцию, работает и работает.

Сделайте полную сборку в D2010: он перестает работать

Вернитесь к D2006 и запустите (без сборки): Это нет работа

Сделать полную сборку в D2006: снова работает

Дает ли это кому-нибудь другие идеи?

Ответы на вопрос(4)

Ваш ответ на вопрос