【问题标题】:Accessing Windows API Constants and Structs for P/Invoke访问用于 P/Invoke 的 Windows API 常量和结构
【发布时间】:2011-07-04 14:11:39
【问题描述】:

快速问题:如何从 .NET 访问 BN_CLICKED 常量和为 Win32 API 定义的其他常量?它们是在某个库中定义的吗?我必须自己定义它们吗?如果是这样,我在哪里可以找到这些值? Windows 版本之间的值是否特定于版本?

【问题讨论】:

  • 没有完美的来源。网络感染了不良的 VB6 声明,pinvoke.net 经常模棱两可和误导,pinvoke 助手只是丑陋的机器生成,SDK 需要掌握 C 技能。只有一个近乎完美的:stackoverflow.com

标签: c# .net winapi


【解决方案1】:

我发现 PInvoke 互操作助手非常有用: http://blogs.microsoft.co.il/blogs/sasha/archive/2008/01/12/p-invoke-signature-generator.aspx.

它几乎应有尽有,可以为您将 C++ 转换为 C#/VB。我很少(如果有的话)再求助于搜索 google/pinvoke.net。

这是 MSDN 杂志文章:http://msdn.microsoft.com/en-us/magazine/cc164193.aspx

最初的 2008 年 1 月 MSDN 杂志文章现在仅以 .CHM help file download 的形式提供,链接自 https://msdn.microsoft.com/magazine/msdn-magazine-issues 的最底部。 (列“CLR 由内而外:托管代码和非托管代码之间的编组。”)

这里是下载地址:http://download.microsoft.com/download/f/2/7/f279e71e-efb0-4155-873d-5554a0608523/CLRInsideOut2008_01.exe。源代码可以在http://clrinterop.codeplex.com/找到。

【讨论】:

  • 这看起来是一个很好的工具,可以将.h 文件(使用 Uwe Keim 的答案获得)转换为 C# P/Invoke 签名。
  • 您通常不需要它们。大多数常量和方法签名都包含在其数据库中。
【解决方案2】:

您可以下载Microsoft Platform SDK 并查看头文件 (*.h)。例如。 BN_CLICKEDwinuser.h 文件中定义。

通常,如果您只需要一个或两个常量,Google search 并查看前几个结果也足够了,因为值会打印在那里。

【讨论】:

  • 对于 WM_COMMAND,这是有用且标准的。但我用谷歌发现了 BN_CLICKED 的两个不同值。
  • @Legatou 无一例外 ;-) 平台 SDK 头文件在我看来绝对是最佳选择。
【解决方案3】:

http://pinvoke.net/this 许多常见的 P/Invoke 定义的绝佳资源。

【讨论】:

  • 真的吗?我发现 PInvoke.net 对方法签名很有用。我试图找到BN_CLICKED,但没有成功。
  • @Uwe Keim - 你是对的 - 我认为这是 BM_CLICK 的拼写错误,但看起来 BN_CLICKED 确实存在。我在 pinvoke.net 上也找不到。
【解决方案4】:

MagNumDB 网站(由 SO 用户 Simon Mourier 提供)是查找常量的简单方法:

http://www.magnumdb.com/search?q=BN_CLICKED

【讨论】:

    【解决方案5】:

    这是一种概念验证,但我将a script 放在一起,可以查找大多数 Windows API 常量。示例用法:

    PS > .\Get-WindowsSDKConstant.ps1 BN_CLICKED
    0
    PS > .\Get-WindowsSDKConstant.ps1 BN_DBLCLK
    5
    PS > .\Get-WindowsSDKConstant.ps1 WM_COMMAND
    273
    

    它需要您下载Visual StudioWindows 10 SDK,因为它在后台编译了一个查找常量的程序。

    最后,回答提问者的问题:

    [常量] 是否在某个库中定义?

    权威来源是Windows Platform SDK

    我必须自己定义它们吗?

    它们不是 Windows 或 .NET 内置的,这意味着您可能会自己定义它们(或从某个地方复制它们)。

    Windows 版本之间的值是否特定于版本?

    它们非常稳定,否则当用户升级到较新版本的 Windows 时,为某个版本的 Windows 编译的程序可能会停止工作。 Microsoft 竭尽全力防止这种情况发生。

    但是,我已经看到至少有一个地方常量不同,具体取决于您正在编译的平台/架构。我不会假设仅仅因为您的代码可以在 x86 64 位 Windows 上运行,它就可以在 ARM 32 位 Windows RT 上运行。

    【讨论】:

      猜你喜欢
      • 2013-07-07
      • 2010-11-18
      • 2020-12-25
      • 2012-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-21
      相关资源
      最近更新 更多