Windows функция обратного вызова WaitForSingleObject () SYNCHRONIZE - PullRequest
0 голосов
/ 26 февраля 2020

У меня есть обратный вызов:

BOOL CALLBACK MyCallback(
  LPVOID pvParam,
  PBLUETOOTH_AUTHENTICATION_CALLBACK_PARAMS pAuthCallbackParams
)
{...}

, как описано в https://docs.microsoft.com/en-us/windows/win32/api/bluetoothapis/nc-bluetoothapis-pfn_authentication_callback_ex

Прежде чем я могу отменить регистрацию этого обратного вызова с помощью функции BluetoothUnregisterAuthentication() (https://docs.microsoft.com/en-us/windows/win32/api/bluetoothapis/nf-bluetoothapis-bluetoothunregisterauthentication), я вызываю функцию WaitForSingleObject(). Я передаю этой функции дескриптор обратного вызова HBLUETOOTH_AUTHENTICATION_REGISTRATION.

WaitForSingleObject() возвращает WAIT_FAILED. И GetLastError() возвращает код 6 (ERROR_INVALID_HANDLE).

Я читаю в Stackoverflow в другом потоке ( Почему WaitForSingleObject возвращает WAIT_FAILED ):

"Если у вас нет привилегии SYNCHRONIZE для объекта, вы не можете ждать. WAIT_FAILED будет возвращено."

Итак, вот мой вопрос:

Как я могу это проверить? ?

Если объект является дескриптором обратного вызова, как я могу проверить, что он имеет привилегию SYNCHRONIZE?

Должен ли я использовать следующую функцию:

#include <AclAPI.H>
GetSecurityInfo()

Как мне вызвать его?

Я пытался:

PSECURITY_DESCRIPTOR psd = 0;
DWORD dwReturnCode = 0;
dwReturnCode = GetSecurityInfo(handle, SE_UNKNOWN_OBJECT_TYPE, SYNCHRONIZE, 0, 0, 0, 0, &psd);

Возвращает код 87 (ERROR_INVALID_PARAMETER).

Спасибо за вашу помощь.


Edit 1

Действительно, в https://docs.microsoft.com/en-us/windows/win32/api/bluetoothapis/nf-bluetoothapis-bluetoothauthenticatedeviceex есть это предложение:

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

Я должен сказать, что когда я читал его, я не понимал его. Давайте будем честными: я до сих пор не очень понимаю это. Что это за «событие», которое внезапно появляется в документации? Хорошо. Так что вы можете подумать, что я тупой или непрофессиональный. Я просто не специалист по Windows, и это респектабельно.

Я должен сказать, что в этом bluetoothapis.h API действительно отсутствуют практические примеры кода. Я думаю, что тот, который я упомянул, является единственным.

Примечание для Microsoft - если Microsoft хочет, чтобы «люди» использовали свои API, Microsoft должна дать им чуть больше пяти строк кода, и не всегда понятные объяснения (по крайней мере, для не супер-специалистов). Разве они не отказались от Windows Mobile, потому что у них не было достаточно разработчиков, чтобы программировать приложения для своих устройств? Да, возможно, также по неясным финансовым причинам и «стратегическому выбору», который не учитывает разработчиков и компании, но причина отказа от Windows Mobile, которую я только что упомянул, является одной из причин, которую они дают. Раньше я программировал для Windows Mobile. Теперь мне нужно программировать с использованием Windows API с одной стороны и Android / Java с другой стороны. Извините, если я не являюсь ни одним из специалистов.

Так, для меня BluetoothRegisterForAuthenticationEx() и BluetoothUnregisterAuthentication() - это черные ящики, и в конечном итоге обратный вызов выполняется.

Я не Посмотрите, что делать с кодом в предоставленной вами ссылке (https://docs.microsoft.com/en-us/windows/win32/sync/using-event-objects). Я не вижу, как интегрировать обратный вызов в него.

У меня есть обратный вызов, определенный как бесплатная функция с этим прототипом:

BOOL CALLBACK BluetoothAuthCallback(LPVOID pvParam, PBLUETOOTH_AUTHENTICATION_CALLBACK_PARAMS pAuthCallbackParams)

, и я использую черные ящики, упомянутые выше, чтобы зарегистрировать и отменить регистрацию обратного вызова.

Не могли бы вы показать мне, с каким-нибудь кодом (или псевдокодом), что нужно сделать?

Заранее спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...