C++ ::SendMessage()

C++ ::SendMessage(),c++,winapi,C++,Winapi,调用后的result值为0 我希望它返回一个有效的pUnkReturn值,但它返回一个NULL值 此呼叫前的必要信息: LRESULT result = ::SendMessage(hWnd, s_MaxGetTaskInterface, (WPARAM)&pUnkReturn, 0); 我在这里得到的s_MaxGetTaskInterface的值是49896 hWnd的值也是合适的。我用Spy++(VisualStudio工具)检查了这一点 Microft Spy++消息窗口为此窗口

调用后的result值为0

我希望它返回一个有效的pUnkReturn值,但它返回一个NULL值

此呼叫前的必要信息:

LRESULT result = ::SendMessage(hWnd, s_MaxGetTaskInterface, (WPARAM)&pUnkReturn, 0);
我在这里得到的
s_MaxGetTaskInterface
的值是49896

hWnd的值也是合适的。我用Spy++(VisualStudio工具)检查了这一点

Microft Spy++消息窗口为此窗口显示以下内容

const UINT CMotionUtils::s_MaxGetTaskInterface =  RegisterWindowMessage(_T("NI:Max:GetTaskInterface"));
009F067C S消息:0xC2E8[已注册:“NI:Max:GetTaskInterface”]wParam:0224C2D0 lParam:00000000
009F067C S消息:0xC2E8[已注册:“NI:Max:GetTaskInterface”]lResult:00000000

请在通话后帮我获取存储在pUnkReturn中的有效地址

当我在谷歌上搜索NI:Max:GetTaskInterface时,我什么也找不到。通常,窗口如何处理给定消息完全取决于相关窗口。窗口(由
hWnd
指定)是否甚至支持
NI:Max:GetTaskInterface
消息?

您必须提供更多信息-什么是“GetTaskInterface”(谷歌不提供任何结果)。SendMessage将返回处理消息“s_MaxGetTaskInterface”的WndProc返回的任何值。如果不处理它,您将返回零,指针仍然为空。

您需要告诉我们什么是
pUnkReturn
,以及它是如何定义的

您还需要告诉我们s_MaxGetTaskInterface的处理程序需要什么


如果您希望处理程序填充pUnkReturn指向的内容,那么您需要使用(WPARAM)pUnkReturn调用SendMessage,但是如果处理程序返回指针,那么现在就调用。

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

目标hWnd是否在同一进程中?否则,您将无法通过消息传递(或返回)指针。请注意,Windows为内置消息执行封送处理。

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

SendMessage()返回的值与消息处理程序返回的值相同。如果您需要pUnkReturn作为out val,那么您的消息处理程序必须填充它


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

目标hWnd是否实际处理消息?这将是一个很好的地方,可以查看并在Debugger中检查它的返回值。您肯定需要更多的信息,如答案中所示。
<00001> 009F067C S message:0xC2E8 [Registered:"NI:Max:GetTaskInterface"]wParam:0224C2D0 lParam:00000000
<00002> 009F067C S message:0xC2E8 [Registered:"NI:Max:GetTaskInterface"]lResult:00000000