2008-09-19 2 views
1
LRESULT result = ::SendMessage(hWnd, s_MaxGetTaskInterface, (WPARAM)&pUnkReturn, 0); 

Значение результата после вызова 0:: SendMessage()

Я ожидаю, что он вернуться с допустимым значением pUnkReturn, но она возвращается со значением NULL.

Необходимая информация до этого вызова:

const UINT CMotionUtils::s_MaxGetTaskInterface = RegisterWindowMessage(_T("NI:Max:GetTaskInterface")); 

Значение s_MaxGetTaskInterface я получаю здесь 49896.

Значение hWnd также является правильным. Я проверил это с помощью Spy ++ (инструмент Visual Studio).

В окне Microft Spy ++ Messages показано следующее для этого окна.

<00001> 009F067C S message:0xC2E8 [Registered:"NI:Max:GetTaskInterface"]wParam:0224C2D0 lParam:00000000 
<00002> 009F067C S message:0xC2E8 [Registered:"NI:Max:GetTaskInterface"]lResult:00000000 

Пожалуйста, помогите мне получить действительный адрес, сохраненный в pUnkВернуться после разговора.

+0

Является ли пункт назначения hWnd фактически обрабатывающим сообщение?это было бы хорошим местом для поиска и проверки его возвращаемого значения в отладчике. – geocoin 2008-09-19 10:27:11

ответ

0

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

0

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

0

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

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

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

1

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

1

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

0

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

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

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