如何在C#中映射HALF_PTR
How to map HALF_PTR in C#
我目前正在建模一种类型转换机制,该机制将本机(Windows数据类型)转换为.NET
示例:
HANDLE = System.IntPtr
HDC = System.IntPtr
WORD = System.UInt16
INT_PTR
在各自的机器上是32位/64位,所以在.NET中是System.IntPtr
HALF_PTR
(和其他)在其各自的32bit/64bit机器上是16bit/32bit。。。
那么我该如何在.NET中为HALF_PTR
建模?如果可能的话?
我想另一种看待这个问题的方法是:是否有一个"短"指针等价于C#。。。像ShortPtr
这不是问题。它在Basetsd.h中声明,但在任何winapi声明中都没有实际使用。你遇到它的几率非常接近于零。
如果必须的话,它只为以64位处理器为目标的程序定义。它将一个64位指针映射到两个32位的两半。通过将IntPtr转换为UInt64,并使用& 0xffffffff
和>> 32
获得两个UInt32部分,您将获得相同的结果。
我认为这在.NET中是不可能的(我指的是Microsoft.NET实现)。在Mono中,可以根据当前的体系结构有条件地将引用重定向到dll,因此可以创建两个HalfPtr
struct
,一个用于32位系统,另一个用于64位系统,但在.NET上这是不可能的。条件编译(#if
)只在编译时进行,而不是在运行时进行,您可能需要类似的东西,但在运行时,并且自动封送处理的功能不足以执行"条件"。
单声道:
<configuration>
<dllmap dll="myhalfptrdll">
<dllentry dll="myhalfptrdll32.so" wordsize="32" />
<dllentry dll="myhalfptrdll64.so" wordsize="64" />
</dllmap>
</configuration>
对于极少数情况,唯一可能的解决方案是制作两个PInvoke extern
,一个"指向"int
,一个指向short
,并由某个静态构造函数选择。
相关文章:
- CLANG 编译器 说:变量"PTR"可能未初始化
- 在以唯一ptr为值的C++映射中,动态内存何时会被销毁
- 将 ptr 传递给 ptr 到 A 作为参数传递给 A 的函数是不好的做法吗?
- 为共享 ptr 向量实现复制 c'tor?
- 字符和整数中 **(ptr+1) 的值差异
- C++:在不中断共享的情况下通过引用传递共享 PTR?
- 如何将派生类从基 ptr 分配给 nlohmann::json
- 引用 std::shared:ptr 以避免引用计数
- 为什么我不能在不进行任何转换的情况下将浮点数放入任何类型的 ptr 中?
- 在调用函数时,ptr** 和 ptr*& 之间是否有区别,或者首选C++?
- 另一种类型的智能ptr,比如具有弱refs的unique_ptr
- 尝试打印出 *ptr++ 的值,以了解它是如何工作的
- 如何控制共享 ptr 引用计数?
- C++中的指针否定 (!ptr == NULL)
- PyTorch C++扩展:访问Half-Tensors的数据
- 从const ptr*转换为ptr*时出现问题
- 这是MSVC 2013中具有共享PTR的单例的正确实现吗?
- 对唯一 ptr 无效读取的引用向量
- C++ 类型转换基础 PTR 到派生 PTR 保存在引用类中
- 如何使用非类型参数传递模板化类的 Ref 或 Ptr