取消引用指针C ++

时间:2011-01-18 18:08:08

标签: c++ pointers dereference

我只是设法在c ++中编写一个全局CBT钩子,可以与c#一起使用。 这可能听起来很愚蠢,但由于我使用c#,我对指针和解除引用的知识非常糟糕。

我无法取消引用lParam所指向的结构内的指针。

它看起来像这样:lParam是一个指向CBT_CREATEWND结构的长指针,后者又包含一个成员“lpcs”和一个指向CREATESTRUCT的指针。这个结构包含一个成员“x”,我想读。我尝试了以下内容,但是我得到x的无效值:

CREATESTRUCT str = *(LPCREATESTRUCT)(((LPCBT_CREATEWND)lParam)->lpcs);
int normal = str.x;
PostMessage(FindWindow(NULL, L"Process Watcher Window"), RegisterWindowMessage(L"ALEXX_SEINE_WNDMESSAGE_C"), wParam, normal);
有人可以帮帮我吗?

2 个答案:

答案 0 :(得分:3)

好吧,我无法真正谈论为什么你得到无效的x值的细节,但我可能会以不同的方式编写这段代码:

// the way you had it, it was making a copy of the CREATESTRUCT and storing it in str
// this just uses a pointer
LPCREATESTRUCT str = ((LPCBT_CREATEWND)lParam)->lpcs;
// when you have a pointer, use -> to use a member
int normal = str->x;

既然你说你不熟悉指针,我会稍微解释->。当您编写x->y时,它与(*x).y实际上相同,但语法更好。

同样注意建议,而此代码中的演员似乎是合理的。一般来说,如果你发现自己经常投入很多,那么你可能会以艰难的方式或错误的方式来做。因此,请确保您花时间了解您所做的任何演员表。

答案 1 :(得分:1)

您的语法似乎已经检查,即使它可能有点不可读,LPCREATESTRUCT强制转换显然是不必要的。

您提到您为x获取了无效值,或许lParam实际上并不是指向CBT_CREATEWND结构的指针?在转换nCode之前,您是否在检查回调函数的HCBT_CREATEWND是否等于lParam