问题标签 [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 回答
4848 浏览

winapi - 从没有GetWindowThreadProcessId的窗口句柄中获取进程ID(c#.net 4.0)

我们的应用程序最近从 .net 3.5 切换到 .net 4。出现的一个问题是 GetWindowThreadProcessId 不再有效。

Microsoft 有一个可用的修补程序,但必须在每台客户计算机上安装它会很痛苦,并且可能会导致其他问题。我更喜欢解决方法。

http://support.microsoft.com/kb/982638

正如微软所描述的,问题是:

“在 .NET Framework 远程应用程序中,您有一个 MarshalByRefObject 对象。该对象包含一个返回 IntPtr 类型的方法。该对象跨进程边界传递。当对象被序列化时,将引发 SerializationException 异常,并且您收到以下错误消息: Invalid type code in stream 'Invalid' 出现此问题的原因是,当 CLR 序列化 IntPtr 时,远程处理代码将 IntPtr 类型视为原始类型。但是,远程处理代码稍后将 IntPtr 类型视为无效类型二进制格式化程序序列化 IntPtr。”

那么,有替代方案吗?我有没有其他方法可以从窗口句柄中获取进程 ID?或者我可以以不同的方式编组我的 IntPtr 以避免这个错误?

0 投票
0 回答
2404 浏览

vb.net - IntPtr 到结构数组

我通过 VB.Net 调用本机 API,传递一个指向结构数组 (RootCausesInfo) 的指针,该指针又包含指向结构数组 (RepairInfoEx) 的指针。API 的本机签名位于MSDN - NdfDiagnoseIncident

我在 VB.Net 中使用的结构定义和 PInvoke 调用是:

调用上述 API 的代码是:

当 API 调用返回时,它使用指向 RootCauseInfo 结构的指针地址填充 rcInfoPtrToArray。我通过以下行获取 RootCauseInfo 的每个实例:

这工作正常。我使用类似的 IntPtr 算法导航到 RepairInfoEx 实例的各个元素:

当我使用以下行将repairInfoExPtr 转换为RepairInfoEx 结构时,对于j = 0 的RepairInfoEx 的第一个实例,它再次正常工作:

但是在 j=1 的下一次迭代中,指针似乎搞砸了,我得到“抛出了“System.ExecutionEngineException”类型的异常。错误。我究竟做错了什么?

0 投票
1 回答
194 浏览

c - C99:数组或堆分配的缓冲区是否会以 UINTPTR_MAX 结束?

我可以假设以下不变量吗?

在我正在编写的解析器中,我想使用指针标记某些偏移量:例如,我可能有char *end_of_submessage, whereend_of_submessage是相对于我当前的缓冲区的。但是如果子消息没有在当前缓冲区内结束,我想使用一个大于当前缓冲区中任何偏移量的值。所以我会这样做:

但是,如果 malloc() 返回的内存使得ptr + len == UINTPTR_MAX或数组具有相同的属性,则此方案将受阻。假设这永远不会发生是否安全?按照标准安全吗?如果不是,在实践中是否安全?

0 投票
3 回答
12798 浏览

c# - Getting Array of struct from IntPtr

I have some struct like this

and I have pointer to array of this struct. So, I need to get array from this pointer. I'm tried to using Marshal.PtrToStructure, but i had memory reading error. This is my methode:

So, what am i doing wrong ?

0 投票
1 回答
4820 浏览

.net - .NET 中的窗口句柄可以改变它的价值吗?

在 .NET 进程的生命周期中,a 的句柄System.Windows.Forms.Form,比如说用于Application.Run(form)实际改变它的值的主要形式,即如果在不同的进程中使用句柄的值,例如IntPtr handle = User32.FindWindow(null, "Name"),是否存在该句柄可能被.NET 运行时失效?

编辑

我需要知道句柄,因为我想为 IPC使用SendMessage等。WM_COPYDATA

0 投票
2 回答
495 浏览

c# - 如何使用 Monotouch 从 IntPtr 获取 ABPerson

Monotouch 中有没有办法从 IntPtr 获取 ABPerson 对象。我正在使用 ABPeoplePickerNavigationController 及其 ABPeoplePickerNavigationControllerDelegate。我必须在方法 ShouldContinue 中读取所选人员的一些属性。我的代码如下所示:

我的自定义委托如下所示:

0 投票
2 回答
11315 浏览

c# - 通过 Marshal.PtrToStructure 将 IntPtr 映射到 Struct 导致“访问冲突异常”

我正在尝试在 .NET 中使用 C++ DLL(实现 EMI 协议的第三方库,具有可用的源代码)。我已经成功地完成了编组、调用函数并让一切正常。

当我想从 IntPtr 编组回到 .NET Struct 时会出现问题,这里是代码(按照建议修改 - 删除了“ref”并更改了 AllocHGlobal 以仅分配 emiStruct 的大小):

最后一行 (PtrToStructure) 导致异常“尝试读取或写入受保护的内存。这通常表明其他内存已损坏”。

此外,我可以看到调试输出:

我认为问题出在指针emiIntPtr的内存分配中。虽然,当我运行代码时,连接到服务器时出现问题(例如找不到服务器),随后对 Struct emiStruct 的编组正确完成(没有例外)。仅当连接成功建立并且服务器发送响应时才会出现此问题。

此外,我使用我尝试在 .NET 中使用的同一个 DLL 库编写了一个 C++ 示例应用程序,并且这个应用程序(当我编译它时)运行良好 - 这意味着 C++ DLL 应该没问题并且不会导致崩溃。

此外,我发现了一些提示来检查/取消选中项目编译器的几个属性(使用 JIT,为 x86 cpu 编译它等),不幸的是,这些都没有帮助。

您对问题可能出在哪里或如何在 .NET 中进行正确的 IntPtr 初始化以及 IntPtr 和 Struct 之间的映射有任何建议吗?

感谢大家的回复:

在这里,我添加了 emi_init 函数的 C++ 标头:

这是 C# emi_init 声明(我已按照建议删除了 emiPtr 的“ref”属性):

但是,仍然得到同样的例外。

0 投票
1 回答
4190 浏览

c# - 无法添加 IntPtr 和 Int

我在 C# Visual Studio 2010 中有这行:

它说:

运算符“+”不能应用于“System.IntPtr”和“int”类型的操作数。

MSDN 说这个操作应该可以工作。

0 投票
3 回答
13064 浏览

c# - C# 中的 Win api。从 IntPtr 获取 Hi 和 Low 单词

我正在尝试在 C# 中处理 WM_MOUSEMOVE 消息。

从 IntPtr 类型的 lParam 获取 X 和 Y 坐标的正确方法是什么?

0 投票
2 回答
175 浏览

c# - 确定哪个 DLL 分配了 IntPtr

我正在开发一个使用从两个单独的 C++ DLL 返回的 IntPtr 的系统。通过调用每个 DLL 中提供的 OBJECT_FREE 方法来释放非托管内存。

不幸的是,一些代码失去了最初分配内存的 DLL 的跟踪。这会导致访问冲突,因为我们已经迁移到 Win7(出于某种原因,我们在 WinXP 上侥幸逃脱)。

在中期,我将不得不包装每个 IntPtr 以正确处理这个问题,但在短期内,有没有办法确定最初是哪个 DLL 分配了内存?