【发布时间】:2011-03-21 14:23:20
【问题描述】:
我想 P/Invoke 到 GetWindowLongPtr 和 SetWindowLongPtr,但我看到关于它们的信息相互矛盾。
一些消息来源说,在 32 位平台上,GetWindowLongPtr 只是一个调用 GetWindowLong 的预处理器宏,而 GetWindowLongPtr 在 user32.dll 中不作为入口点存在。例如:
- pinvoke.net entry for SetWindowLongPtr 有一个静态方法,它检查 IntPtr.Size,然后调用 SetWindowLong 或 SetWindowLongPtr,并带有注释说“旧版操作系统不支持 SetWindowLongPtr”。没有解释“旧版操作系统”的含义。
- answer on StackOverflow 声明“在 32 位系统上,GetWindowLongPtr 只是一个指向 GetWindowLong 的 C 宏”。
因此,这些来源似乎表明 *Ptr 入口点根本不存在于 user32.dll 版本中,例如 32 位 Windows 7。
但我在 MSDN 文档中没有看到任何迹象。根据 MSDN,SetWindowLongPtr 取代了 SetWindowLong,简单明了。根据SetWindowLongPtr page 的要求部分,SetWindowLongPtr 似乎自 Windows 2000(客户端和服务器版本)以来一直存在于 user32.dll 中。同样,没有提及 32 位操作系统中缺少入口点。
我怀疑事实介于两者之间:当您告诉 C++ 编译器以较旧的操作系统为目标(即编译将在 Win9x 和 NT4 上运行的东西)时,头文件将 SetWindowLongPtr 声明为调用 SetWindowLong 的宏,但入口点可能确实存在于 Windows 2000 及更高版本中,如果您告诉编译器以这些平台为目标,您将直接获得它(而不是宏)。但这只是一个猜测;我真的没有资源或专业知识来挖掘和验证它。
目标平台也有可能发挥了作用——如果您为 x86 平台编译应用程序,那么您不应该在 64 位操作系统上调用 SetWindowLongPtr。再说一次,我知道的足以思考这个问题,但我不知道如何找到答案。 MSDN 似乎暗示 SetWindowLongPtr 总是正确的。
谁能告诉我简单地 P/Invoke 到 SetWindowLongPtr 并完成它是否安全? (假设 Windows 2000 及更高版本。) P/Invoking to SetWindowLongPtr 会给我正确的入口点:
- 如果我在 32 位操作系统上运行针对 x86 平台的应用程序?
- 如果我在 64 位操作系统上运行针对 x86 平台的应用程序?
- 如果我在 64 位操作系统上运行针对 x64 平台的应用程序?
【问题讨论】:
标签: c# .net pinvoke setwindowlong getwindowlong