转换指向/来自LRESULT的指针

时间:2013-04-21 07:53:03

标签: winapi casting lparam

我正在寻找关于这个windows编程习惯用语的确认,我是否认为许多不同类型的“句柄”不仅作为LRESULT对象而且作为lParam和wParam对象传递?

我猜测只要我们知道LRESULT或lParam / wParam中的“什么”类型的句柄,我们就可以重新投入其中。

例如

case WM_CREATE:
   ...
   //create a window
   //lParam is the CREATESTRUCT for new window created here
   ....
   return lParam;
...
...
CREATESTRUCT cStruct = (CREATESTRUCT)SendMessage(hwnd, msg /*WM_CREATE*/);
cStrcut.cx;//this is the width of the new window?

正确?

这是“正确的”吗?任何人都可以向我和StaticOverflow社区提供关于这种技术/习语的简短论文吗?

问题: 我们应该只返回lParam(或仅wParam)值吗? 有人应该知道的任何陷阱吗? LRESULT和LPARAM都是LONG_PTR类型,它们是32或64位整数。我不是一个经验丰富的C程序员,但看起来这些整数只是被用作“缓冲区”,程序员后来在使用之前将其转换为“真实”类型......声音准确吗?

1 个答案:

答案 0 :(得分:2)

这种编程风格“糟糕”,因为无法在编译时知道真正的内容。也就是说,由于WIN32 API是一个C API(而不是C ++),当人们想要使用相同的方法签名传递任何类型的结构时,没有太多可以做的事情。

因此,API设计团队决定使用两个参数来处理这个问题。一个32位LPARAM和一个16位WPARAM

使用Win32 C API时,您只需要确保正确阅读文档,并确保您正在使用文档所说的

所以回答你的问题,你是对的 - 但这只是因为你别无选择。为了在这里完成,MFC出现了(对于C ++程序员),但这不是一个好的面向对象的库 - 它更像是一个包装器。还有其他人做得更好(例如wxWidgets)。