我想 P/Invoke 到GetWindowLongPtr和SetWindowLongPtr,我看到关于它们的信息相互矛盾。
一些消息来源说,在 32 位平台上,GetWindowLongPtr 只是一个调用 GetWindowLong 的预处理器宏,而 GetWindowLongPtr 在 user32.dll 中不作为入口点存在。例如:
- SetWindowLongPtr的pinvoke.net 条目有一个静态方法,该方法检查 IntPtr.Size,然后调用 SetWindowLong 或 SetWindowLongPtr,并带有注释说“旧版操作系统不支持 SetWindowLongPtr”。没有解释“遗留操作系统”的含义。
- StackOverflow 上的答案指出“在 32 位系统上,GetWindowLongPtr 只是一个指向 GetWindowLong 的 C 宏”。
因此,这些来源似乎表明 *Ptr 入口点根本不存在于 user32.dll 版本中,例如 32 位 Windows 7。
但我在 MSDN 文档中没有看到任何迹象。根据 MSDN,SetWindowLongPtr取代了 SetWindowLong,简单明了。并且根据SetWindowLongPtr 页面的要求部分,似乎 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 平台的应用程序?