> For this situation you cannot use pinned pointers (which are only legal
> on the stack) but you should use a pinning handle. Create a GCHandle for
[quoted text clipped - 10 lines]
> Ronald Laeremans
> Visual C++ team
Thanks for your response. That answers the question of whether or not I can
use a __pin pointer in that way. I tried creating an array of GCHandles and
then calling GCHandle::Alloc to create the pinned handles, but it didn't
work, because I get an ArgumentException: "An instance with nonprimitive
(non-blittable) members cannot be pinned." What I'm actually trying to do is
a little more complicated, namely pin several 2D arrays of enums:
public __value enum MyEnum : unsigned char { ValueOne = 1, ValueTwo = 2};
public MyFunc()
{
Array* array __gc[] = new Array*[numObjects];
GCHandle pinners __gc[] = new GCHandle[numObjects];
vector<char*> v;
for (int i = 0; i < numObjects; i++)
{
MyEnum e __gc[,] = new MyEnum[10, 10];
array[i] = e;
pinners[i] = GCHandle::Alloc(__box(e[0, 0]), GCHandleType::Pinned);
v.push_back(static_cast<char*>(pinners[i].AddressOfPinnedObject()));
}
UnmanagedFunction(v);
// Omitted: Also call GCHandle.Free on the handles
}
I noticed also, that you cannot even create a GCHandle (pinned) on a single
enum of any kind. That seems really strange to me. Is there any way to pass
an array of 2D arrays of value-enums to unmanaged code?
Ronald Laeremans [MSFT] - 18 Jun 2005 05:38 GMT
>>For this situation you cannot use pinned pointers (which are only legal
>>on the stack) but you should use a pinning handle. Create a GCHandle for
[quoted text clipped - 39 lines]
> enum of any kind. That seems really strange to me. Is there any way to pass
> an array of 2D arrays of value-enums to unmanaged code?
You don't need to pin enums or other value types, they are always
allocated inline, for these it is enough that you pin the array
containing them.
I hope that is better news. :-)
Ronald