::发信息( )

时间:2020-03-06 14:25:15  来源:igfitidea点击:
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将以处理消息" s_MaxGetTaskInterface"的WndProc返回的任何值返回。如果未处理,则将返回零,并且指针仍为NULL。

我们需要告诉我们" pUnkReturn"是什么以及如何定义。

我们还需要告诉我们s_MaxGetTaskInterface的处理程序期望什么。

如果希望处理程序填充pUnkReturn指向的内容,则需要使用(WPARAM)pUnkReturn调用SendMessage,但是如果处理程序返回指针,则按我们现在的操作进行调用。

我认为基于匈牙利前缀,需要在&pUnkReturn中使用&。我希望pUnkReturn的类型为IUnknown *。消息接收者将提供IUnknown *。它存储IUnknown *的地址是IUnknown *。因此,此代码传入&pUnkReturn,并且消息接收器将写入(IUnknown **)wParam。

目的地是否在同一过程中?否则,我们将无法通过消息传递(或者返回)指针。请注意,Windows实现了内置消息的封送处理。

问题不在于我们如何调用SendMessage()。问题出在我们为" NI:Max:GetTaskInterface"注册消息的消息处理程序的实现中。

SendMessage()返回的值与从消息处理程序返回的值相同。如果需要将pUnkReturn设置为超出值,则消息处理程序必须填充它。

让我们看看消息处理程序的代码。