LRESULT result = ::SendMessage(hWnd, s_MaxGetTaskInterface, (WPARAM)&pUnkReturn, 0);
Значение результата после звонка 0
Я ожидаю, что он вернется с допустимым значением pUnkReturn, но он вернется со значением NULL.
Необходимая информация перед звонком:
const UINT CMotionUtils::s_MaxGetTaskInterface = RegisterWindowMessage(_T("NI:Max:GetTaskInterface"));
Значение s_MaxGetTaskInterface, которое я получаю, составляет 49896.
Значение hWnd также правильное. Я проверил это с помощью Spy ++ (инструмент Visual Studio).
Окно сообщений Microft Spy ++ показывает мне следующее для этого окна.
<00001> 009F067C S message:0xC2E8 [Registered:"NI:Max:GetTaskInterface"]wParam:0224C2D0 lParam:00000000
<00002> 009F067C S message:0xC2E8 [Registered:"NI:Max:GetTaskInterface"]lResult:00000000
Пожалуйста, помогите мне получить действующий адрес, сохраненный в pUnkReturn после звонка.
Определенно нужна дополнительная информация, как видно из ответов.





Когда я поискал в Google NI:Max:GetTaskInterface, я ничего не нашел. В общем, то, как окно будет обрабатывать данное сообщение, полностью зависит от соответствующего окна. Окно (указанное hWnd) даже поддерживает сообщение NI:Max:GetTaskInterface?
Вам нужно будет предоставить дополнительную информацию - что такое "GetTaskInterface" (Google не дает результатов). SendMessage вернет значение, возвращаемое WndProc, который обрабатывает сообщение «s_MaxGetTaskInterface». Если он не обработан, вы вернете ноль, и ваш указатель по-прежнему будет NULL.
Вам нужно будет рассказать нам, что такое pUnkReturn и как он определяется.
Вам также нужно будет сообщить нам, что ожидает обработчик s_MaxGetTaskInterface.
Если вы ожидаете, что обработчик заполнит все, на что указывает pUnkReturn, вам нужно будет вызвать SendMessage с помощью (WPARAM) pUnkReturn, однако, если обработчик вернет указатель, вызовите, как вы делаете сейчас.
Я думаю, что нужен & in & pUnkReturn, исходя из венгерского префикса. Я ожидаю, что pUnkReturn будет иметь тип IUnknown *. Получатель сообщения предоставит IUnknown *. Адрес, по которому будет храниться IUnknown *, является IUnknown **. Следовательно, этот код передает & pUnkReturn, а получатель сообщения записывает в * (IUnknown **) wParam.
Целевой hWnd находится в том же процессе? В противном случае вы не сможете передать (или вернуть) указатель в сообщении. Обратите внимание, что Windows реализует маршаллинг для встроенных сообщений.
Проблема не в том, как вы вызываете SendMessage (). Проблема заключается в вашей реализации обработчика сообщений для зарегистрированного сообщения "NI: Max: GetTaskInterface".
Значение, возвращаемое функцией SendMessage (), совпадает со значением, возвращаемым обработчиком сообщений. Если вам нужно, чтобы pUnkReturn был out-val, ваш обработчик сообщений должен заполнить его.
Давайте посмотрим код вашего обработчика сообщений.
Действительно ли адресат hWnd обрабатывает сообщение? это было бы хорошее место, чтобы посмотреть и проверить возвращаемое значение в отладчике