LRESULT,WPARAM和LPARAM是什么意思?

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

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

我在C#中使用什么类型的LRESULT? int还是IntPtr

在此处输入图像描述

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

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

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

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

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

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

WPARAMUINT_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传递,因此除非您聚焦上下文,否则不能指定任何特定含义。

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

请参阅LPARAM和WPARAM的定义是什么?

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

  • LPARAMLRESULT L表示“long”,指定32位int
  • WPARAM w表示“word”(曾经是16位int但现在也是32位int – 至少在针对32位架构时)

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

wParamlParam参数内容的实际含义取决于发送的特定消息; 它们只是消息参数的通用桶。 因此,您很可能无法规避不安全的类型转换。