LRESULT,WPARAM和LPARAM是什么意思?

Bit*_*lue 17 c# winapi pointers intptr

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

  • 他们的意思是什么 ?LRESULT作为最后的结果?W-PARAM?L-PARAM?
  • 如何安全地"包裹"它们
    • WPARAM并且LPARAM有时包含结构.所以我需要将它们用作IntPtr.怎么样LRESULT?我安全int还是更好IntPtr?

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

Han*_*ant 55

在此输入图像描述

那是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 (20认同)
  • 对 SDK 头文件和文档使用的 Systems Hungarian 起源的微小修正:[文档人员](http://blogs.msdn.com/b/oldnewthing/archive/2004/06/22/162629.aspx# 163721)显然引入了*“一些严重的可读性变化”*,其余的都是历史了。 (2认同)

Fel*_*ano 5

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

#if defined(_WIN64)
 typedef __int64 LONG_PTR; 
#else
 typedef long LONG_PTR;
#endif
Run Code Online (Sandbox Code Playgroud)

WPARAM是UINT_PTR的 typedef ,其中UINT_PTR是:

#if defined(_WIN64)
 typedef unsigned __int64 UINT_PTR;
#else
 typedef unsigned int UINT_PTR;
#endif
Run Code Online (Sandbox Code Playgroud)

您基本上可以看到最终指向相同大小位的类型:唯一真正的区别是您使用的是 Windows 32 还是 64。就使用意义而言,它们是您可以根据窗口过程需要使用的一般浇注参数做。通常,由于几个数字是不够的,因此会使用复杂的数据结构并将它们的值作为 WPARAM 或 LPARAM 传递,因此除非您关注上下文,否则您无法分配任何特定含义。