OpenSCManager на локальном компьютере — НОЛЬ против «localhost» как lpMachineName

#c #windows #winapi #windows-services

#c #Windows #winapi #windows-службы

Вопрос:

Согласно документации MSDN по lpMachineName параметру функции OpenSCManager WinAPI:

Если указатель равен нулю или указывает на пустую строку, функция подключается к диспетчеру управления службами на локальном компьютере.

Передача «localhost» или «127.0.0.1» приведет к тому же поведению, что и передача NULL или пустой строки? Или я должен выполнить проверку в своей логике и заменить «localhost» или «127.0.0.1» на NULL перед вызовом OpenSCManager ?

Комментарии:

1. Похоже на то. Однако мне интересно, прослушивает ли он другой локальный IP-адрес, кроме 127.0.0.1 … в диапазоне может быть что угодно 127.0.0.0/8 .

2. результат будет намного хуже с точки зрения производительности. через несколько раз. необходимо использовать 0, если вам нужно подключиться к локальной базе данных

Ответ №1:

OpenSCManager, конечно, использует специальный быстрый путь для подключения к локальному диспетчеру управления службами. для использования этого быстрого пути OpenSCManager необходимо каким-то образом определить, что мы хотим подключиться к локальной базе данных. это, конечно, делается путем проверки lpMachineName. лучшим и документированным вариантом — будет использовать нулевой указатель здесь. тогда почти такой же эффект будет, если использовать пустую строку. затем, возможно, OpenSCManager может сравнивать lpMachineName с некоторыми жестко запрограммированными строками. в моем тесте он сравнивает lpMachineName с localhost и . и если не совпадает — нужно перейти на медленный путь. для строковой функции 127.0.0.1 проверка не выполняется.

для сравнения быстрого и медленного пути, некоторые внутренние фрагменты OpenSCManager :

быстрый путь: (здесь и выбранный путь)

введите описание изображения здесь

медленный путь:

введите описание изображения здесь

быстрый путь:

введите описание изображения здесь

медленный путь:

введите описание изображения здесь

быстрый путь:

введите описание изображения здесь

медленный путь:

введите описание изображения здесь

Комментарии:

1. Большое вам спасибо за подробный ответ! Не могли бы вы подробнее рассказать о 3 парах подключенных стеков? Каковы параметры каждой медленной и быстрой «пары»? Спасибо!

2. @golosovsky — «быстрый» дамп с 0 в lpMachineName и «медленный» с «127.0.0.1». это просто показывает другое — гораздо лучше использовать 0 вместо «127.0.0.1»