::Отправить сообщение( ) - PullRequest
1 голос
/ 19 сентября 2008
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 после звонка.

Ответы [ 6 ]

1 голос
/ 07 ноября 2008

Назначение hWnd в том же процессе? Если нет, вы не сможете пропустить (или вернуть) указатель через сообщение. Обратите внимание, что Windows реализует сортировку для встроенных сообщений.

1 голос
/ 19 сентября 2008

Я думаю, что & in & pUnkReturn необходим, основываясь на венгерском префиксе. Я ожидаю, что pUnkReturn будет иметь тип IUnknown *. Получатель сообщения предоставит IUnknown *. Адрес, где будет храниться это IUnknown *, является IUnknown **. Следовательно, этот код передает в & pUnkReturn, и получатель сообщения записывает в * (IUnknown **) wParam.

0 голосов
/ 07 ноября 2008

Проблема не в том, как вы вызываете SendMessage (). Проблема заключается в реализации обработчика сообщений для зарегистрированного сообщения «NI: Max: GetTaskInterface».

Значение, которое возвращает SendMessage (), совпадает со значением, которое возвращается из вашего обработчика сообщений. Если вам нужно, чтобы pUnkReturn был out-val, ваш обработчик сообщений должен заполнить его.

Давайте посмотрим код для вашего обработчика сообщений.

0 голосов
/ 19 сентября 2008

Вам нужно будет сообщить нам, что такое pUnkReturn и как оно определено.

Вам также необходимо сообщить нам, что ожидает обработчик для s_MaxGetTaskInterface.

Если вы ожидаете, что обработчик заполнит все, на что указывает pUnkReturn, вам нужно вызвать SendMessage с (WPARAM) pUnkReturn, однако, если обработчик возвращает указатель, вызовите, как вы делаете сейчас.

0 голосов
/ 19 сентября 2008

Вам нужно будет предоставить больше информации - что такое «GetTaskInterface» (Google не дает результатов). SendMessage вернется с любым значением, возвращаемым из WndProc, который обрабатывает сообщение «s_MaxGetTaskInterface». Если он не обработан, вы получите ноль обратно, а указатель все равно будет равен NULL.

0 голосов
/ 19 сентября 2008

Когда я гуглил по NI:Max:GetTaskInterface, я ничего не мог найти. В общем, то, как окно будет обрабатывать данное сообщение, полностью зависит от соответствующего окна. Поддерживает ли окно (указанное hWnd) сообщение NI:Max:GetTaskInterface?

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