问题标签 [pin-ptr]

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 投票
2 回答
1008 浏览

performance - pin_ptr performance relative to native (VC) heap objects

In a C# to native lib CLI/C++ wrapper, I have a choice:

  • Store native pointer in a managed class (native object is created using native "new")

or

  • Store native object as a data blob in a managed class' field, and use pin_ptr to pin it before each native use.

Has anyone done any comparative analysis on the relative performance costs of the two paths?

Thanks!

0 投票
1 回答
783 浏览

list - 如何将 pin_ptr 放入通用列表中?

我有一个托管 C++ 方法,该方法将 String^ 列表作为参数

该方法需要使用指向字符串^中内存的指针填充非托管结构

使用 PtrToStringChars 提取 WCHAR* 非常简单

但是我不知道在设计时要分配的 pin_ptr 的数量

我想将固定的 ptr 添加到列表中,类似于下面的 List< pin_ptr< const wchar_t>>

这样做会产生错误 C3225:“T”的泛型类型参数不能是“cli::pin_ptr”,它必须是值类型或引用句柄

有没有办法做到这一点?在托管 C++ 中

0 投票
1 回答
266 浏览

string - 我需要 pin_ptr 来传递文字字符串吗?

从托管 c++ 函数中,我想调用一个非托管函数,该函数需要一个 'const char *' 作为参数。

下面的 a) 和 b) 是否正确?对于 b),我需要 pin_ptr 'hello' 吗?a) 呢?谢谢。

一种) myFunction( "hello" );

b)

0 投票
1 回答
829 浏览

memory - pin_ptr 原生 void* 帮助

设置

我有一个 PDF API,它具有下面定义的本机函数。

如果我在我的 C++/CLI 包装函数中调用上述代码,它会返回正确的字符串,但在我调用 PDF_CloseDoc 时会引发 AccessViolationException。哎呀。我忘了 pin_ptr 指向文档的指针。

问题

当我 pin_ptr pdoc 时,我可以成功调用这些本机函数,但是当 PDF_GetMetaText 返回时缓冲区不再包含我的字符串。

我也尝试过固定缓冲区[0],但这会导致 GetMetaText 出现访问冲突异常。

问题

我不能说 GetMetaText 中发生了什么,所以我不确定 pdoc 发生了什么。对上述代码有什么建议吗?

0 投票
2 回答
1383 浏览

visual-c++ - vc++中的pin_ptr和interior_ptr

我正在开发一个项目,该项目是由以前在 Visual c++ 2008 中工作的人编写的(STM32 的 HID 接口)。所以为了模仿导致问题的行,我在 VC++ 2008 中创建了一个示例 winform 应用程序。这里是仅当为 x64 构建时,这一行的单击事件才会产生构建错误,但 win32 构建不会产生任何构建错误并且工作正常。

并且仅针对 x64 构建出现的构建错误是:

谢谢。

0 投票
1 回答
1253 浏览

c++-cli - 使用 pin_ptr 时访问冲突?

当我使用 pin_ptr 在本机 c 代码中传递数组时,我遇到访问冲突。代码如下:

当我更改此代码以分配新空间并将原始数组复制到该代码时,我没有遇到访问冲突。新代码:

问题:我使用 from pin_ptr 有什么问题吗?

0 投票
1 回答
861 浏览

pointers - internal_ptr pin_ptr 的问题

我正在尝试构建一个 cli/c++ ref 类。此类的目的是包装具有某些功能的本机类指针。本机类指针由黑盒工厂方法提供给我。对于我的生活,我无法弄清楚如何固定本机指针使其不动。这是代码中的场景(可以这么说):

我不断收到:错误 C2440:'=':无法从 'cli::pin_ptr' 转换为 'NativeFooClass*'

我以为编译器对待它们是一样的?我需要静态转换吗?好像不对???

我试图固定这个指针的原因是因为当我尝试在一个方法中使用它,然后从 C# 调用这个方法时,我得到一个 AccessViolation 运行时错误“{”试图读取或写入受保护的内存。这通常表明其他内存已损坏。"}"

0 投票
1 回答
1336 浏览

arrays - 复制数组时无用的pin_ptr

我有一些遗留代码,它们将本机数组复制到托管数组中:

我无法重构它,Runtime::InteropServices::Marshal::Copy因为原始数组是双精度的,而目标是浮点数。

我的问题是我不明白为什么 pin_ptr。我不认为这是必要的,但它是一段关键的代码,我想在删除它之前确定。

您认为删除它是否安全?

0 投票
1 回答
5108 浏览

string - pin_ptr & PtrToStringChars vs. StringToHGlobalAnsi:为什么 PtrToStringChars var 失去了它的价值?

我正在使用 C++/CLI,我想WNetAddConnection2从 Windows Networking 调用该函数。
首先,我知道 C++/CLI 不是我工作的首选语言,但我现在无法更改它,例如改用 C#。

现在的问题是,这个函数需要 wchar_t*,所以我需要将 System::String^ 转换为 wchar_t*。
解决方案 1):使用pin_ptrPtrToSTringCharsvcclr.h
解决方案 2):使用StringToHGlobalUni. (标题提到StringHToGlobalAnsi是因为更多的人正在搜索它,所以他们可能会找到这篇文章并且它的答案更快)。

我发现这两种解决方案都有效。但是#1并非如此。我已将 WNet 函数放入CWNetShare具有以下构造函数的 ref 类中:

其中m_wszLocalDrive是 type 的私有CWNetShare成员wchar_t*

真正的问题:m_oWNetShare = gcnew CWNetShare从 Winform 类构造函数(我知道,C++/CLI 和 Winforms ......)调用构造函数时,一切似乎都很好。字符串i_sLocalDrive和其他字符串已正确转换和分配。但是m_oWNetShare稍后访问时,所有 m_wsz... 变量中的值都会丢失。看起来对象被 GC 移动了。
因此我做了一个测试:

m_oManaged = gcnew CManaged;再次在其构造函数中添加一个 winform 。以后访问m_oManaged的时候,如果m_oManaged没有被移动,m_wszPinned就可以了。
在此处输入图像描述
但是在GCing之后,它显示出胡说八道。但是 m_wsznothing 保持它的价值,所以这不是问题wchar_t*,而是 pin_ptr 的问题。的地址m_oManaged变了,但是地址m_wszPinned还是一样的,那为什么值会丢失呢?
在此处输入图像描述

这里出了什么问题?
那么 pin_ptr 和 PtrToSTringChars 还有用吗?

我现在正在使用编组,这很有效。

0 投票
0 回答
307 浏览

c++-cli - cli::数组作为混合班的成员

我想拥有一个托管缓冲区作为混合类的成员:

这导致:

错误 C3265:无法在非托管“A”中声明托管“m_managedBuffer”

所以我尝试使用 auto_gcroot:

并得到以下错误:

错误 C2106:“=”:左操作数必须是左值

我的解决方案是使用托管包装器

我不喜欢这样,因为它引入了一个间接级别来访问实际缓冲区,此外,当我想固定托管缓冲区(pin_ptr)时 - 我该怎么做?我可以只固定内部 m_bytes 成员而不固定外部 ByteArray 对象吗?

解决方案:使用 gcroot 代替 auto_gcroot。托管字节数组将被 GC 清理,不必在 auto_gcroot 下。