3

我从 Visual Studio 2012 中的代码分析工具收到此警告。代码如下所示:

using System;
using System.Runtime.InteropServices;

namespace MyProgramNamespace
{
    class NativeMethods
    {
        [DllImport("user32.dll", EntryPoint = "GetWindowLongPtr")]
        public static extern IntPtr GetWindowLongPtr(IntPtr handle, int flag);

        [DllImport("user32.dll", EntryPoint = "SetWindowLongPtr")]
        public static extern IntPtr SetWindowLongPtr(IntPtr handle, int flag, IntPtr ownerHandle);
    }
}

我只为 x64 编译,所以我不关心使用旧的 GetWindowLong 和 SetWindowLong。据我所知,这些入口点名称是正确的。

编辑:已解决。原来问题在于 Visual Studio 本身(以及代码分析工具)是 32 位的。当代码分析工具检查 user32.dll 以查看这些函数是否存在时,它会检查 user32.dll 的 32 位版本(在 C:/Windows/SysWOW64/ 中),而不是程序实际使用的那个(64 位版本)在 C:/Windows/System32 中),并且这些函数只存在于 64 位版本(32 位版本使用 GetWindowLong/SetWindowLong 而不是 GetWindowLongPtr/SetWindowLongPtr(注意 PTR 部分))。

4

3 回答 3

1

(这个答案也发布在原始问题底部的编辑中,以帮助人们快速轻松地找到它)

原来问题在于 Visual Studio 本身(以及代码分析工具)是 32 位的。当代码分析工具检查 user32.dll 以查看这些函数是否存在时,它会检查 user32.dll 的 32 位版本(在 C:/Windows/SysWOW64/ 中),而不是程序实际使用的那个(64 位版本)在 C:/Windows/System32 中),并且这些函数只存在于 64 位版本(32 位版本使用 GetWindowLong/SetWindowLong 而不是 GetWindowLongPtr/SetWindowLongPtr(注意 PTR 部分))。

于 2012-11-21T17:56:57.563 回答
1

它们不起作用的原因是,通过EntryPoint =在 DllImport 属性中指定,您是在告诉 Marshaller,“这是我希望您调用的确切函数”。

user32.dll中没有调用函数GetWindowLongPtr。有GetWindowLongPtrAGetWindowLongPtrW

当您省略 时EntryPoint=,Marshaller 将根据正在运行的操作系统调用一个或另一个。

因此,要么将其忽略,要么指定 A 或 W 版本。如果您指定 A 或 W,您还需要指定CharSet=CharSet.AnsiA 版本或CharSet=CharSet.UnicodeW 版本。

于 2012-10-30T21:19:46.683 回答
0

尝试以下操作:

    [DllImport("user32.dll", EntryPoint = "GetWindowLongPtrW")]
    public static extern IntPtr GetWindowLongPtr(IntPtr handle, int flag);

    [DllImport("user32.dll", EntryPoint = "SetWindowLongPtrW")]
    public static extern IntPtr SetWindowLongPtr(IntPtr handle, int flag, IntPtr ownerHandle);
于 2012-10-30T21:11:28.280 回答