【问题标题】:How to map HALF_PTR in C#如何在 C# 中映射 HALF_PTR
【发布时间】:2013-08-15 21:35:40
【问题描述】:

我目前正在建模一种将原生 (Windows Data Types) 转换为 .NET 的类型转换机制

示例:

HANDLE = System.IntPtr
HDC = System.IntPtr
WORD = System.UInt16

INT_PTR 在它们各自的机器上是 32 位/64 位,所以在 .NET 中就是 System.IntPtr

HALF_PTR(和其他人)在各自的 32 位/64 位机器上是 16 位/32 位...

那么我将如何在 .NET 中为 HALF_PTR 建模 - 如果可能的话?

我想另一种看待这个问题的方式是:是否有一个与 C# 等效的“短”指针...类似于 ShortPtr?

【问题讨论】:

  • 使用 HALF_PTR?因为如果它只是为一种或两种方法封送数据,那么为这些方法创建一些代理可能会更快。
  • @xanatos,你认为在这方面,我可以从我的代码中省略这种类型的“短”指针并警告用户使用它吗?
  • 多年使用Win32 API我从未见过HALF_PTR,似乎只在very specialized cases中使用;我什至不认为它实际上用于任何公共 API,因为谷歌搜索“HALF_PTR site:microsoft.com”并没有给出与struct 或函数相关的任何结果。因此,我认为忽略它是安全的,并在它可能出现的极少数情况下提供警告,解释使用它的 struct/ 函数需要手动干预。
  • @series0ne 向我们展示您想要转换的 API! :-) 否则它变成一个抽象问题。同一个问题通常有多种解决方案。

标签: c# c++ .net types native


【解决方案1】:

这不是问题。它在 Basetsd.h 中声明,但实际上并未在 any winapi 声明中使用。您实际上遇到它的几率非常接近于零。

如果必须,它只为面向 64 位处理器的程序定义。它将一个 64 位指针映射到两个 32 位半部分。通过将 IntPtr 转换为 UInt64 并使用 & 0xffffffff>> 32 获得两个 UInt32 部分,您将得到相同的结果。

【讨论】:

  • 我有一种感觉,你会知道这个问题的答案。我发现了一些你在另一个网站上写的关于指针的 cmets。 :-)
【解决方案2】:

我认为这在 .NET 中是不可能的(我的意思是 Microsoft .NET 实现)。在 Mono 中,可以有条件地将引用重定向到基于当前架构的 dll,因此您可以创建两个 HalfPtr structs,一个用于 32 位系统,一个用于 64 位系统,但在 .NET 上,这不是不可能。条件编译 (#if) 仅在编译时,而不是在运行时,您需要类似但在运行时的东西,并且自动编组功能不足以执行“条件”。

单声道:

<configuration>
    <dllmap dll="myhalfptrdll">
        <dllentry dll="myhalfptrdll32.so" wordsize="32" />
        <dllentry dll="myhalfptrdll64.so" wordsize="64" />
    </dllmap>
</configuration>

对于极少数情况,唯一可能的解决方案是创建 2 个 PInvoke externs,将一个“指向”int,一个指向short,并由某个静态构造函数选择。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多