我正在导入WinApi函数,在C#中编写回调等(example),并且总是想知道:
LRESULT
作为最后结果? W-PARAM? L-PARAM?WPARAM
和LPARAM
有时包含结构。所以我需要将它们用作IntPtr
。 LRESULT
怎么样? int
或更好IntPtr
? 我在C#中使用什么类型的LRESULT? int
或IntPtr
?
答案 0 :(得分:53)
这是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)
这是匈牙利表示法的一个例子:
L
LPARAM
和LRESULT
表示“long”,指定32位int
{li> w
WPARAM
表示“字”(过去是16位int
但现在也是32位int
- 至少在定位32时-bit架构)
类型名称/别名的其余部分应该暗示它们的含义,即包含某种结果值的LRESULT
,LPARAM
和WPARAM
用于参数变量。< / p>
wParam
和lParam
参数'内容的实际含义取决于发送的特定邮件;它们只是消息参数的通用桶。所以你很可能无法规避不安全的类型演员。
答案 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