【问题标题】:Dereferencing pointer C++取消引用指针 C++
【发布时间】:2011-01-18 18:08:08
【问题描述】:

我刚刚设法用 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);

有人可以帮帮我吗?

【问题讨论】:

  • 取消引用部分看起来不错。你确定你正确调用了 api 函数来获取值吗?
  • 你不能这样做吗:LPCREATESTRUCT str = (LPCREATESTRUCT)(((LPCBT_CREATEWND)lParam)->lpcs);其次是 int normal = str->x;
  • @Michael :不需要(LPCREATESTRUCT)演员表。 lpcs 已经是 LPCREATESTRUCT 类型。

标签: c++ pointers dereference


【解决方案1】:

好吧,我真的不能详细说明为什么你会得到无效的 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相同,但语法更好。

还有一点建议,虽然这段代码中的强制转换看起来很合理。一般来说,如果你发现你投了很多,你可能是在用困难的方式或错误的方式来做。因此,请务必花时间了解您所做的任何演员表。

【讨论】:

  • 查看我的编辑。也许最后一行导致错误的值被发送到我的 c# 程序?
  • 您试图在另一个进程中获取有关 HWND 的信息还是什么?
【解决方案2】:

您的语法似乎已经过检查,尽管它可能有点不可读,LPCREATESTRUCT 演员表显然是不必要的。

你提到你得到x 的无效值,也许lParam 不是真正的指向CBT_CREATEWND 结构的指针?在转换 lParam 之前,您是否检查了回调函数的 nCode 是否等于 HCBT_CREATEWND

【讨论】:

  • 那么x 的值是多少?该值是否无效但始终相同?你能举个例子吗?我想我有点把它变成一个 Win32 问题而不是指针,但很明显这不是一个取消引用问题。
  • 好的,例如,每次创建窗口时我都会得到 -2147483648(或类似的东西)!
  • #define CW_USEDEFAULT 0x80000000,当类型为 LPARAM(长,32 位)时为 -2147483648。该值是正确的,并且您的代码很好。参考CreateWindowEx 参数x 的文档。
  • “usedefault”是什么意思?所以我应该将 c# 中的 lParam 作为 UIntPtr 读取?但是我有 CW_USEDEFAULT,但是窗口位置是什么??
  • 打开一堆资源管理器窗口,不移动任何一个。它们由系统自动定位,因为它们是用CW_USEDEFAULT 作为CreateWindowEx 的x/y 参数初始化的。如果您需要检索窗口的位置,您可以稍后在您的程序中进行,在处理完ALEXX_SEINE_WNDMESSAGE_C 消息之后。
猜你喜欢
  • 2019-05-20
  • 1970-01-01
  • 2011-06-17
  • 1970-01-01
  • 2018-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多