我想p/invoke到GetWindowLongPtrSetWindowLongPtr,我看到了关于它们的冲突信息。
一些消息来源说,在32位平台上,getwindowlongptr只是一个调用getwindowlong的预处理器宏,而getwindowlongptr在user32.dll中不作为入口点存在。例如:
pinvoke.net entry for SetWindowLongPtr有一个静态方法,该方法检查intptr.size,然后调用setwindowlong或setwindowlongptr,并带有一条注释,说明“传统操作系统不支持setwindowlongptr”。对于“遗留操作系统”的含义没有任何解释。
32位系统上的answer on StackOverflowstates“getwindowlongptr只是一个指向getwindowlong的c宏”。
因此,这些来源似乎表明,*ptr入口点根本不在32位windows 7附带的user32.dll版本中。
但我在msdn文档中没有看到这方面的迹象。根据msdn,SetWindowLongPtr取代setwindowlong,简单明了。根据SetWindowLongPtr page的“需求”部分,setwindowlongptr自windows 2000(客户端和服务器版本)以来一直位于user32.dll中。同样,没有提到32位操作系统中缺少入口点。
我怀疑真相介于两者之间:当你告诉C++编译器以较旧的操作系统为目标(即,编译将在Win9x和NT4上运行的东西)时,头文件将setWindowLongPTR声明为一个调用setWindowLong的宏,但入口点可能确实存在于Windows2000及更高版本中,如果告诉编译器以这些平台为目标,您将直接获得它(而不是宏)。但那只是一个猜测;我没有真正的资源或知识来挖掘和验证它。
目标平台也有可能扮演一个角色——如果您为x86平台编译应用程序,那么您不应该在64位操作系统上调用setwindowlongptr。再说一次,我知道得足以思考这个问题,但我不知道如何找到答案。msdn似乎表明setwindowlongptr总是正确的。
有人能告诉我简单地p/invoke来设置windowlongptr并完成它是否安全吗?(假设Windows 2000及更高版本)调用setwindowlongptr是否会给出正确的入口点:
如果我在32位操作系统上运行针对x86平台的应用程序?
如果我在64位操作系统上运行针对x86平台的应用程序?
如果我在64位操作系统上运行针对x64平台的应用程序?

最佳答案

我建议你用windows窗体内部处理的方式来处理:

public static IntPtr GetWindowLong(HandleRef hWnd, int nIndex)
{
    if (IntPtr.Size == 4)
    {
        return GetWindowLong32(hWnd, nIndex);
    }
    return GetWindowLongPtr64(hWnd, nIndex);
}


[DllImport("user32.dll", EntryPoint="GetWindowLong", CharSet=CharSet.Auto)]
private static extern IntPtr GetWindowLong32(HandleRef hWnd, int nIndex);

[DllImport("user32.dll", EntryPoint="GetWindowLongPtr", CharSet=CharSet.Auto)]
private static extern IntPtr GetWindowLongPtr64(HandleRef hWnd, int nIndex);

10-06 14:24