【发布时间】:2012-10-20 07:12:33
【问题描述】:
我从 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部分))。
【问题讨论】:
-
这是推测,但可能代码分析工具只检查 32 位版本的 user32.dll。 32 位版本的 user32.dll 中不存在 Get/SetWindowLongPtr。如果代码分析工具本身是 32 位的,这可能就是原因。
-
另外,如果我注释掉底部的 2 行(对于 SetWindowLongPtr),所有警告都会消失。然而,由于这些行未注释,Get 和 Set 方法都会发出警告。如果我只注释掉前 2 行(Get),Set 仍然会发出警告
-
@Jargon 我会将解决方案作为答案发布并标记它,因为给出的答案都不正确(包括我的)。
标签: c# interop pinvoke analysis