Re: Pinning Pointers with __pin in Managed C++
- From: "Ronald Laeremans [MSFT]" <ronaldl@xxxxxxxxxxxxxxxxxxxx>
- Date: Fri, 17 Jun 2005 21:38:10 -0700
Hexar Anderson wrote:
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."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?
I hope that is better news. :-)
Ronald .
- References:
- Pinning Pointers with __pin in Managed C++
- From: Hexar Anderson
- Re: Pinning Pointers with __pin in Managed C++
- From: Ronald Laeremans [MSFT]
- Re: Pinning Pointers with __pin in Managed C++
- From: Hexar Anderson
- Pinning Pointers with __pin in Managed C++
- Prev by Date: Re: Compiling C and C++
- Next by Date: RE: templates in mixed compilands in VC 7.1
- Previous by thread: Re: Pinning Pointers with __pin in Managed C++
- Next by thread: STDIN and STDOUT in C
- Index(es):
Relevant Pages
|