#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»