【问题标题】:I keep getting "Unable to find an entry point named 'GetWindowLongPtrA' in DLL 'user32.dll'" [duplicate]我不断收到“无法在 DLL 'user32.dll' 中找到名为 'GetWindowLongPtrA' 的入口点” [重复]
【发布时间】:2019-02-22 19:36:07
【问题描述】:

我正在尝试使用GetWindowLongPtrA,但我不断收到“无法在 DLL 'user32.dll' 中找到名为 'GetWindowLongPtrA' 的入口点”。 (也SetWindowLongPtrA 得到同样的错误)。我尝试了很多在 Google 上找到的解决方案,但都没有解决。

这是我写的函数的声明:

[DllImport("user32.dll")]
public static extern IntPtr GetWindowLongPtrA(IntPtr hWnd, int nIndex);

试过把EntryPoint = "GetWindowLongPtrA",把GetWindowLongPtrA改成GetWindowLongPtr,把CharSet = CharSet.Ansi,换成GetWindowLongPtrWCharSet = CharSet.Unicode等等,都没有用。

我的计算机完全是“64 位”(但不能调用那个 64 位 WinAPI 函数?)。操作系统是 Windows 10。

但是我的系统驱动器的可用空间不足。这是一个可能的原因吗?

这个问题的解决方法是什么?

【问题讨论】:

  • 这个函数不是叫GetWindowLongPtr吗?而且我认为如果您以 32 位进程为目标,那么您应该调用 GetWindowLong。
  • 我试过 GetWindowLongPtr 但也没有用。是的,GetWindowLong 确实有效,但鉴于我的系统是 64 位的,所以我认为使用 GetWindowLong 会更好。我尝试使用 GetWindowLongPtr 删除另一个窗口的最大化和最小化按钮,但它不起作用(这些按钮仍然留在那里)所以我认为我应该使用“Ptr”版本。
  • 我的电脑完全是“64 位” - 但我猜你的进程是 32 位的。只有进程位数在这里起作用
  • 空间不足可能导致任何事情。你需要先解决这个问题。空间回收:1) Quick Options, 2) Detailed Options。只需将您的下载和媒体文件夹转储到小型 USB 驱动器或 SD 磁盘上?之后运行 cleanmgr.exe 并可能进行压缩(对于快速 SSD 驱动器)。
  • 不是问题的根源,但 P-Invoke marshaller 知道如何处理 A/W 业务,而您正在妨碍它。当您将函数声明为GetWindowLongPtr 并分配CharSet = CharSet.Auto 时,它将正确选择WA 版本并处理字符串转换。

标签: c# .net winapi pinvoke getwindowlong


【解决方案1】:

user32.dll 的 32 位版本中没有名为 GetWindowLongPtrGetWindowLongPtrAGetWindowLongPtrW 的函数:

使用GetWindowLongPtr 而不考虑目标位数的原因是C 和C++ WinAPI 代码在32 位代码中是一个调用GetWindowLong(A|W) 的宏。它只存在于user32.dll的64位版本中:

pinvoke.net 上的导入 GetWindowLongPtr 的文档包含一个代码示例,说明如何使此导入对目标位数透明(请记住,当您实际尝试调用不存在的导入函数时会引发错误,不在DllImport 行):

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

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

// This static method is required because Win32 does not support
// GetWindowLongPtr directly
public static IntPtr GetWindowLongPtr(IntPtr hWnd, int nIndex)
{
     if (IntPtr.Size == 8)
     return GetWindowLongPtr64(hWnd, nIndex);
     else
     return GetWindowLongPtr32(hWnd, nIndex);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-14
    • 2016-01-02
    • 2021-08-05
    • 2017-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多