# Thursday, November 22, 2007

From Jason Olson.

//code starts here

#pragma once
#include
<msclr\marshal.h>
#include <msclr\marshal_windows.h>

namespace msclr {
namespace interop {

////////////////////////////////////////////////////////////////////
// GUID Conversions
////////////////////////////////////////////////////////////////////

template<>
inline _GUID marshal_as<_GUID, System::Guid>(const System::Guid& from) {

    System::Guid^ source = from;
    array<Byte>^ guidData = source->ToByteArray();
    pin_ptr<Byte> data = &(guidData[ 0 ]);
    return *(_GUID *)data;

}

template<>
inline Guid marshal_as<System::Guid, _GUID>(const _GUID& from) {
    
return System::Guid( from.Data1, from.Data2, from.Data3, from.Data4[ 0 ], from.Data4[ 1 ],
                                 from.Data4[ 2 ], from.Data4[ 3 ], from.Data4[ 4 ], from.Data4[ 5 ],
                                 from.Data4[ 6 ], from.Data4[ 7 ] );

}

}

}

//code ends here

At first glance the pin_ptr is a little scary, but this code doesn't return it, it dereferences it. So no "GC hole" to worry about.

Kate

posted on Thursday, November 22, 2007 8:41:32 AM (Eastern Standard Time, UTC-05:00)  #    Comments [0]
Related posts:
HFONT and System::Drawing::Font
RECT, CRect, and System::Drawing::Rectangle
Some handy file system flags