将'this'指针传递为LPARAM

时间:2012-08-27 18:03:07

标签: c++ visual-studio-2010 winapi casting compiler-errors

我的课程如下:

#include <Windows.h>
class MyClass
{
   void A();
   static BOOL CALLBACK proc(HWND hwnd, LPARAM lParam);
};

void MyClass::A()
{
   EnumChildWindows(GetDesktopWindow(), MyClass::proc, static_cast<LPARAM>(this));
}

BOOL CALLBACK MyClass::proc(HWND hwnd, LPARAM lParam)
{
   // ...
   return TRUE;
}

当我尝试在Visual C ++ 2010中编译它时,我收到以下编译器错误:

错误C2440:'static_cast':无法从'MyClass * const'转换为'LPARAM' 没有可以进行此转换的上下文

如果我按如下方式更改MyClass::A的定义,则编译成功:

void MyClass::A()
{
   EnumChildWindows(GetDesktopWindow(), MyClass::proc, (LPARAM)this);
}

第一个例子中错误的解释是什么?

3 个答案:

答案 0 :(得分:8)

您需要使用reinterpret_cast而不是static_cast来执行强制转换为完全不相关的类型。有关不同类型的C ++强制转换的详细信息,请参阅此When should static_cast, dynamic_cast, const_cast and reinterpret_cast be used?

答案 1 :(得分:3)

static_cast用于投放相关类型,例如intfloatdoublefloat,或转换需要很少的努力,例如调用单参数构造函数或调用用户定义的转换函数。

LPARAMthis几乎无关,所以您需要的是reinterpret_cast

LPARAM lparam =  reinterpret_cast<LPARAM>(this);
EnumChildWindows(GetDesktopWindow(), MyClass::proc, lparam);

答案 2 :(得分:0)

如您所知,this指针是 const ,static_cast运算符无法抛弃 const volatile __ unaligned 属性。看看this link on MSDN