相关疑难解决方法(0)

如何在32位平台上pinvoke到GetWindowLongPtr和SetWindowLongPtr?

我想P/Invoke到GetWindowLongPtrSetWindowLongPtr,我看到有关它们的相互矛盾的信息.

有些消息称,在32位平台上,GetWindowLongPtr只是一个调用GetWindowLong的预处理器宏,而GetWindowLongPtr不作为user32.dll中的入口点存在.例如:

  • SetWindowLongPtrpinvoke.net条目有一个静态方法,它检查IntPtr.Size,然后调用SetWindowLong或SetWindowLongPtr,注释说"遗留操作系统不支持SetWindowLongPtr".没有解释"遗留操作系统"的含义.
  • StackOverflow答案是 "On 32bit系统GetWindowLongPtr只是一个指向GetWindowLong的C宏".

因此,这些来源似乎表明*Ptr入口点根本不存在于32位Windows 7附带的user32.dll版本中.

但我在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 /调用SetWindowLongPtr会给我正确的入口点:

  • 如果我在32位操作系统上运行针对x86平台的应用程序?
  • 如果我在64位操作系统上运行针对x86平台的应用程序?
  • 如果我在64位操作系统上运行针对x64平台的应用程序?

.net c# pinvoke getwindowlong setwindowlong

13
推荐指数
1
解决办法
7915
查看次数

带有非导出函数的 DllImport。为什么有效?

我刚刚在 C# 中遇到了 DllImport 的奇怪行为,我无法解释。我想知道它是如何可能的,以及我可以在哪里阅读它。案例是通过 DllImport 可以调用不真正导出表单 dll 的函数。就我而言,它是 kernel32.dll 和函数 ZeroMemory(但具有复制/移动/填充内存这样的行为)。所以,我的代码:

[DllImport("kernel32", EntryPoint = "LoadLibraryW", CharSet = CharSet.Unicode, SetLastError = true)]
public static extern IntPtr LoadLibrary(string libName);

[DllImport("kernel32.dll", CharSet = CharSet.Ansi, ExactSpelling = true, SetLastError = true)]
public static extern IntPtr GetProcAddress(IntPtr module, string procName);

//WTF???
[DllImport("kernel32.dll", SetLastError = true)]
public static extern bool ZeroMemory(IntPtr address, int size);

static void TestMemory()
{
    IntPtr mem = Marshal.AllocHGlobal(100); //Allocate memory block of 100 bytes size
    Marshal.WriteByte(mem, 55);            //Write some value in …
Run Code Online (Sandbox Code Playgroud)

.net c# winapi marshalling dllimport

6
推荐指数
1
解决办法
153
查看次数