问题标签 [intptr]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1126 浏览

c# - API 调用的 SafeProcessHandle 和 IntPtr 之间的区别

在使用 WinAPI 时,我决定在我的 C# 应用程序中实现对GetProcessAfinityMask的调用。但是,我已经看到了这个函数的两个不同的签名。

其中一种SafeProcessHandle用于手柄:

另一个可能的版本(在 P/Invoke 上)使用IntPtr

SafeProcessHandle鉴于这两个函数返回相同的值,传递一个实例或传递一个有什么区别IntPtr

0 投票
2 回答
1546 浏览

c# - 使用 XmlSerializer 序列化 IntPtr

我想知道为什么 XmlSerializer 实现不支持 IntPtr 类型。当我尝试序列化包含 IntPtr 类型字段的类时,序列化失败并告诉我不支持 IntPtr,并忽略该成员。

为了解决这个问题,我将 IntPtr 值转换为 Int64 ......但这是个好主意吗?应该是,就我所能想到的。具体来说,我需要序列化一个窗口句柄,它在 .NET 框架中输入为 IntPtr。我做得对吗?

0 投票
2 回答
5766 浏览

c# - Windows 消息中的 IntPtr 到字符串转换

我通过挂钩窗口消息遇到了麻烦。我需要检测窗口文本(标题)的变化,所以我拦截了有趣窗口的 WM_SETTEXT 消息(我这样做是因为在创建窗口时没有指定窗口标题)。

阅读WM_SETTEXT文档的文档,lParam参数指定了一个指向表示窗口文本的字符串的指针。

使用 SendMessage 将消息转发到 .NET 应用程序。我在 .NET 应用程序中所做的是:

其中 ProcessMessage 是处理 .NET 表单的消息的例程。

我总是得到一个空字符串,这不是预期的结果。我尝试了其他 Marshal.PtrToString* 方法,但没有人奏效。

在将IntPtr转换为String时我做错了什么?

(*)请注意,我无法调试此代码,因为它会阻塞整个系统,因为所有 Windows 消息都被拦截。

0 投票
2 回答
3107 浏览

c# - 将 const char* 字符串从非托管传递到托管

我有两个通信组件 - 一个托管,另一个非托管。托管需要从非托管实现中检索字符串(相同的字符串或只是一个副本)。我尝试了以下代码。

但是, testStr 的值不是预期的。有谁知道我在这里做错了什么?任何建议都会非常有帮助。

0 投票
2 回答
7681 浏览

c++ - 错误:从 'Foo*' 转换为 'unsigned int' 失去精度

我正在尝试将指针转换为 int(或 unsigned int),无论我尝试什么,它都不想工作。

我已经尝试过static_cast<intptr_t>(obj),reinterpret_cast<intptr_t>(obj)和 C 风格强制转换的各种组合, intptr_t's, unsigned int's, 我包括 stdint.h。从我读过的内容来看,我尝试过的许多事情之一应该可以工作。是什么赋予了?

我没有费心包含代码,因为它正是我所描述的,但既然你问了,我已经尝试了所有这些以及其他组合:

他们都给出了完全相同的错误。

0 投票
2 回答
2483 浏览

c# - C# 调用返回指针的 C++ 方法。解释内存管理

有人可以在下面的“Main”中的 2 C# 行中从低级别/内存管理的角度解释到底发生了什么吗?

C++ 代码(非托管):

C#代码:

具体来说,我想知道.NET 如何知道为“myClass”分配多少空间?它必须在后台执行某种“Marshal.AllocHGlobal(SIZE)”,对吗?如果需要更多空间会发生什么(我设置了名称?)?此外,是否存在垃圾收集和移动内存并弄乱我的“IntPtr myClass”的风险?

0 投票
2 回答
1537 浏览

c# - 新的 IntPtr.Add 方法 - 我错过了 int 的要点吗?

从 FW 4.0 开始,该IntPtr结构具有以下Add方法:

太好了,因为它应该解决IntPtr我们遇到的所有数学问题(12,可能更多)。

但为什么是offset int
一定不是IntPtr吗?我可以很容易地想象将 64 位指针偏移一个超出int范围的值。


例如,考虑Marshal.OffsetOf

它返回一个IntPtr作为结构成员的偏移量。这很有意义!并且您不能轻松地将此偏移量与新Add方法一起使用。您必须将其转换为Int64,然后Add在循环中多次调用。

此外,它似乎扼杀了IntPtr.Size与正确编写的应用程序无关的想法。您必须将偏移量转换为特定类型,例如Int64,此时您必须开始管理大小差异。想象一下当 128 位IntPtr出现时会发生什么。


我的问题是,为什么?
我的结论是正确的,还是我错过了重点?

0 投票
3 回答
7591 浏览

c# - 哪个更好/更安全:HandleRef 或 IntPtr(来自 Microsoft 的较新源代码不再使用 HandleRef)

例如,在旧的 .NET Framework 2.0 源代码(Windows 窗体,Visual Studio 2005 - Whidbey)中,GetClientRect函数是使用HandleRef定义的:

在新的 Windows API 代码包(来自 Microsoft,2009/2010)中,使用IntPtr定义了相同的函数:

实际上,在任何 Windows API 代码包源文件中都没有使用HandleRef,而在旧的 .NET Framework 源文件中的本机方法签名中大量使用了它。

0 投票
2 回答
34776 浏览

c# - IntPtr 到字节数组并返回

参考如何在 C# 中从 byte[] 获取 IntPtr

我正在尝试将 IntPtr 引用的数据读入字节 [],然后再读回另一个 IntPtr。指针引用的是从扫描仪设备捕获的图像,因此我还假设捕获此信息应放入字节数组中。

我也不确定 Marshal.SizeOf() 方法是否会返回 IntPtr 引用的数据的大小或指针本身的大小。

我的问题是我收到错误“类型'System.Byte []'不能被封送为非托管结构;无法计算有意义的大小或偏移量”

0 投票
1 回答
1156 浏览

interop - 关于通过 ref、空指针和 IntPtr 传递结构的互操作问题

同事,

前言。我的问题更多关于最佳实践。我知道一种解决方法。这是我第一次在 C# 中处理互操作,同时我用 C 和 C++ 编写了相当多的代码。

我需要调用 2 次非托管 DLL 公开的函数。该函数将指向结构的指针作为参数。第一次我需要传递一个null指针。第二次我需要传递一个指向结构实例的指针。

该函数有 6 个参数,因此下面是用于此问题的简化声明。(如果有人感兴趣,我可以发布细节。)这是声明的第一个变体:

我喜欢它,因为它是针对NEEDED_STRUCT_TYPE. 但是为了能够传递一个空指针,我不得不将声明更改为

现在我可以传递指针IntPtr.Zeronull但参数不再是强类型的。在给定的情况下,有没有办法同时拥有:强类型参数和传递空指针的能力?

任何建议,见解或参考都非常感谢!

干杯,
-尼克