LRESULT,WPARAM和LPARAM是什么意思?

时间:2013-07-25 07:13:20

标签: c# winapi pointers intptr

我正在导入WinApi函数,在C#中编写回调等(example),并且总是想知道:

  • 他们是什么意思? LRESULT作为最后结果? W-PARAM? L-PARAM?
  • 如何安全地“包裹”它们
    • WPARAMLPARAM有时包含结构。所以我需要将它们用作IntPtrLRESULT怎么样? int或更好IntPtr
    • ,我安全吗?

我在C#中使用什么类型的LRESULT? intIntPtr

4 个答案:

答案 0 :(得分:53)

enter image description here

这是Charles Simonyi,微软应用软件部门的前负责人,开发Word和Excel的团队。他是设置标识符命名标准的人。由于没有人知道如何发音他的姓氏,他们选择了他出生的国家并称之为匈牙利符号。 Windows小组也采用了它,但选择了“糟糕”的类型,匈牙利系统。选择标识符的第一个字母以记录变量的类型。与“好”类型相反,Apps Hungarian,它按逻辑类型名称而不是物理类型名称选择前缀。西蒙尼的版本。

所以它是L,就像Long,W和Word一样。 LPCWSTR就是这样的,它是指向常量宽字符串的长指针。系统匈牙利语的一个明显问题是,当架构发生变化时,它不再运行得那么好。最初选择16位操作系统(L = 32位,W = 16位),在不更改名称(W = 32位)的情况下迁移到32位,今天我们处于64位(L = W = 64位)。

所以忽略这些前缀,它们只是一个历史性的意外。您确实必须为LRESULT类型选择IntPtr,它当然可以是64位版本的Windows上的64位值。当你不这样做时很难诊断问题,这是一个常见的问题。

偏离主题,你在照片背景中看到的模糊图像也是一个关于西蒙尼的有趣信息。微软与员工分享了巨大的成功,并将其中许多人变成了百万富翁。您在后台看到的是停靠在国际空间站的航天飞机的镜头。西蒙尼是七位“太空游客”之一,并为自己买了一张去国际空间站的机票。唯一一个这样做两次,让他回到6000万美元:)

答案 1 :(得分:2)

这些名字来自历史原因。在WIndows16位时代,WPARAM意味着匈牙利表示法中的字参数和LPARAM长参数。移动到32位折叠到相同的大小(32位整数)但保持名称不变。 LRESULT意味着长期结果,并且由于历史原因再次保留名称。当windows64位出现时,会发生另一个变化。 请have a look here in MSDN获取完整列表。 详情: LPARAM LRESULT 都是 LONG_PTR 的typedef,其中LONG_PTR为:

#if defined(_WIN64)
 typedef __int64 LONG_PTR; 
#else
 typedef long LONG_PTR;
#endif

WPARAM UINT_PTR 的typedef,其中 UINT_PTR 是:

#if defined(_WIN64)
 typedef unsigned __int64 UINT_PTR;
#else
 typedef unsigned int UINT_PTR;
#endif

您基本上可以看到最终指向相同大小位的类型:唯一真正的区别是您使用的是Windows 32或64。 根据用法的含义,它们是您可以使用的一般pourpose参数,具体取决于窗口过程需要执行的操作。通常,由于没有使用几个数字,因此使用复杂数据结构的poiter并将它们的值作为WPARAM或LPARAM传递,因此除非您聚焦上下文,否则不能指定任何特定含义。

答案 2 :(得分:1)

这是匈牙利表示法的一个例子:

    {li} L LPARAMLRESULT表示“long”,指定32位int {li> w WPARAM表示“字”(过去是16位int但现在也是32位int - 至少在定位32时-bit架构)

类型名称/别名的其余部分应该暗示它们的含义,即包含某种结果值的LRESULTLPARAMWPARAM用于参数变量。< / p>

wParamlParam参数'内容的实际含义取决于发送的特定邮件;它们只是消息参数的通用桶。所以你很可能无法规避不安全的类型演员。

答案 3 :(得分:1)

LPARAM是LONG_PTR的typedef,它在win32上为long(带符号的32位),在x86_64上为__int64(带符号的64位)。

WPARAM是UINT_PTR的typedef,它是win32上的unsigned int(无符号32位)和x86_64上的unsigned __int64(无符号64位)。

  

typedef UINT_PTR WPARAM;

     

typedef LONG_PTR LPARAM;

在c#中您可以使用 IntPtr

请参阅What are the definitions for LPARAM and WPARAM?

相关问题