Re: Pinning Pointers with __pin in Managed C++
- From: "Hexar Anderson" <HexarAnderson@xxxxxxxxxxxxxxxxxxxxxxxxx>
- Date: Fri, 17 Jun 2005 15:12:03 -0700
"Ronald Laeremans [MSFT]" wrote:
> 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
> each reference, call the GCHandle Alloc member 2 parameter overload with
> Pinned as the handle type. Put the handle in an array, create a second
> array (of IntPTR) and put the result of calling
> GCHandle::AddressOfPinnedObject into that and then you can pass that to
> native code.
>
> Note that a design that needs this probably requires rethinking since
> keeping lots of pinnen objects (like an array of them) around for a long
> time isn't something to do too lightly.
>
> 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?
.
- Follow-Ups:
- Re: Pinning Pointers with __pin in Managed C++
- From: Ronald Laeremans [MSFT]
- Re: Pinning Pointers with __pin in Managed C++
- References:
- Pinning Pointers with __pin in Managed C++
- From: Hexar Anderson
- Re: Pinning Pointers with __pin in Managed C++
- From: Ronald Laeremans [MSFT]
- Pinning Pointers with __pin in Managed C++
- Prev by Date: Re: Pinning Pointers with __pin in Managed C++
- Next by Date: Compiling C and C++
- Previous by thread: Re: Pinning Pointers with __pin in Managed C++
- Next by thread: Re: Pinning Pointers with __pin in Managed C++
- Index(es):
Relevant Pages
|