C++ cli 引脚阵列\u ptr<;类型>;

C++ cli 引脚阵列\u ptr<;类型>;,c++-cli,C++ Cli,我需要封送一个String^数组来调用需要一个BSTR数组的非托管函数 我在MSDN上找到了这篇文章 使用此代码示例: // MarshalBSTR1.cpp // compile with: /clr #define WINVER 0x0502 #define _AFXDLL #include <afxwin.h> #include <iostream> using namespace std; using namespace System; using name

我需要封送一个String^数组来调用需要一个BSTR数组的非托管函数

我在MSDN上找到了这篇文章

使用此代码示例:

// MarshalBSTR1.cpp
// compile with: /clr
#define WINVER 0x0502
#define _AFXDLL
#include <afxwin.h>

#include <iostream>
using namespace std;

using namespace System;
using namespace System::Runtime::InteropServices;

#pragma unmanaged

void NativeTakesAString(BSTR bstr) {
   printf_s("%S", bstr);
}

#pragma managed

int main() {
   String^ s = "test string";

   IntPtr ip = Marshal::StringToBSTR(s);
   BSTR bs = static_cast<BSTR>(ip.ToPointer());
   pin_ptr<BSTR> b = &bs;

   NativeTakesAString( bs );
   Marshal::FreeBSTR(ip);
}
//marshallbstr1.cpp
//使用:/clr编译
#定义WINVER 0x0502
#定义
#包括
#包括
使用名称空间std;
使用名称空间系统;
使用名称空间System::Runtime::InteropServices;
#布拉格非托管
无效本地制成品字符串(BSTR BSTR){
printf_s(“%s”,bstr);
}
#布拉格管理
int main(){
字符串^s=“测试字符串”;
IntPtr ip=Marshal::StringToBSTR(s);
BSTR bs=静态_cast(ip.ToPointer());
引脚ptr b=&bs;
NativeTakesAString(bs);
封送:FreeBSTR(ip);
}
因此,我创建了一个新的BSTR数组,并为数组的每个字符串调用Marshal::StringToBSTR()。 然后我创建了一个托管pin_ptr阵列

array<pin_ptr<BSTR> >^ gcDummyParameters = gcnew array<pin_ptr<BSTR> >(asParameters->Length);
array^gcDummyParameters=gcnewarray(asParameters->Length);
但我收到了错误:

Error   2   error C2691: 'cli::pin_ptr<Type>' : a managed array cannot have this element type
错误2错误C2691:'cli::pin_ptr':托管阵列不能具有此元素类型
我还尝试使用本机数组:

pin_ptr<BSTR> dummyParameters[100000];
pin_ptr dummy参数[100000];
但即使在这种情况下,我也犯了一个错误:

Error   1   error C2728: 'cli::pin_ptr<Type>' : a native array cannot contain this managed type 
错误1错误C2728:'cli::pin_ptr':本机数组不能包含此托管类型

我还能做什么?

Microsoft示例看起来很奇怪:不需要固定BSTR类型,因为它是非托管的。只需创建BSTR数组并使用Marshal::StringToBSTR填充每个成员。不要使用pin_ptr。

Microsoft示例看起来很奇怪:没有必要对BSTR类型进行pin,因为它是非托管的。只需创建BSTR数组并使用Marshal::StringToBSTR填充每个成员。不要使用pin_ptr。

应从该样本中删除pin_ptr。bs是一个局部变量,垃圾收集器不会移动它,它也会通过值传递给本机函数,因此如果它确实移动了,就不会有问题


它指向的BSTR内容是由系统的BSTR分配器本机分配的,垃圾收集器也不会移动它。

pin\u ptr应从此示例中删除。bs是一个局部变量,垃圾收集器不会移动它,它也会通过值传递给本机函数,因此如果它确实移动了,就不会有问题


它指向的BSTR内容是由系统的BSTR分配器本机分配的,垃圾收集器也不会移动它。

是的,示例片段完全是假的。只需使用BSTR数组[]。这让我觉得可能有微软的一些模糊的理由来确定一个BSTR。如果可能的话,我更愿意站在安全的角度:)我相信Hans Passant的确认会让你站在安全的角度:)BSTR只是非托管指针,GC不会触及非托管内存。否则,简单的C++/CLI代码,如int*p=newint[1]*p=1;不要崩溃,不要对其他问题有任何注意,它从一个错误的假设开始。因为.NET值类型(托管C++结构)被存储在堆栈上……“在一般情况下,这是不正确的。只需使用BSTR数组[]。这让我觉得可能有微软的一些模糊的理由来确定一个BSTR。如果可能的话,我更愿意站在安全的角度:)我相信Hans Passant的确认会让你站在安全的角度:)BSTR只是非托管指针,GC不会触及非托管内存。否则,简单的C++/CLI代码,如int*p=newint[1]*p=1;不要崩溃,不要对其他问题有任何注意,它从一个错误的假设开始。因为.NET值类型(托管C++结构)存储在堆栈上……“在一般情况下,这是不正确的。