gpt4 book ai didi

c# - "P/Invoke entry points should exist"应该是正确的入口点

转载 作者:行者123 更新时间:2023-11-30 17:09:13 24 4
gpt4 key购买 nike

我从 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 部分))。

最佳答案

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

在 user32.dll 中没有名为 GetWindowLongPtr 的函数。有 GetWindowLongPtrAGetWindowLongPtrW

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

因此要么将其保留,要么指定 A 或 W 版本。如果您指定 A 或 W,您还需要为 A 版本指定 CharSet=CharSet.Ansi 或为 W 版本指定 CharSet=CharSet.Unicode

关于c# - "P/Invoke entry points should exist"应该是正确的入口点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13147597/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com