массив pin_ptr <Type> - PullRequest
       3

массив pin_ptr <Type>

0 голосов
/ 30 августа 2010

Мне нужно собрать массив строк String ^, чтобы вызвать неуправляемую функцию, которая ожидает массив BSTR.

В MSDN я нашел статью

Как: Marshal COMСтроки с использованием C ++ Interop

с этим примером кода:

// 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);
}

Итак, я создал новый массив BSTR и назвал Marshal :: StringToBSTR () для каждой строки массива,Затем я создал управляемый массив pin_ptr.

array<pin_ptr<BSTR> >^ gcDummyParameters = gcnew array<pin_ptr<BSTR> >(asParameters->Length);

, но получил ошибку:

Error   2   error C2691: 'cli::pin_ptr<Type>' : a managed array cannot have this element type

Я пытался также с собственным массивом:

pin_ptr<BSTR> dummyParameters[100000];

, нодаже в этом случае я получил ошибку:

Error   1   error C2728: 'cli::pin_ptr<Type>' : a native array cannot contain this managed type 

Что еще я могу сделать?

Ответы [ 2 ]

2 голосов
/ 30 августа 2010

pin_ptr должен быть удален из этого образца. bs - это локальная переменная, которая не будет перемещаться сборщиком мусора, также она передается собственной функции по значению, поэтому при ее перемещении проблем не возникнет.

Содержимое BSTR, на которое оно указывает, изначально выделяется системным распределителем BSTR, оно также не будет перемещаться сборщиком мусора.

2 голосов
/ 30 августа 2010

Образец Microsoft выглядит странно: нет необходимости закреплять тип BSTR, потому что он неуправляемый.Просто создайте массив BSTR и заполните каждый член, используя Marshal :: StringToBSTR.Не используйте pin_ptr.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...