#pragma once #include #include using namespace System; ref class Utils sealed { public: static void ThrowIfFailed(::HRESULT hr) { if (hr < 0) throw gcnew Runtime::InteropServices::COMException(nullptr, hr); } static Guid FromGUID(_GUID& guid) { return Guid(guid.Data1, guid.Data2, guid.Data3, guid.Data4[0], guid.Data4[1], guid.Data4[2], guid.Data4[3], guid.Data4[4], guid.Data4[5], guid.Data4[6], guid.Data4[7]); } static _GUID ToGUID(Guid& guid) { array^ guidData = guid.ToByteArray(); pin_ptr data = &(guidData[0]); return *(_GUID*)data; } static _GUID* ToGUIDArray([System::Runtime::InteropServices::In] array^ input) { if (input == nullptr) return nullptr; pin_ptr pg = &input[0]; VSS_ID* buf = new VSS_ID[input->Length]; for (int i = 0; i < input->Length; i++) buf[i] = Utils::ToGUID(pg[i]); return buf; } generic delegate TOUT Conv(TIN input); template static TOUT* ToNative(array^ input, Conv^ func) { if (input == nullptr) return nullptr; if (input->Length == 0) return new TOUT[0]; pin_ptr pin = &input[0]; TIN* p = pin; TOUT* buf = new TOUT[input->Length]; for (int i = 0; i < input->Len; i++) { input[i] = func(pin[i]); } return buf; } }; class SmartGuid { private: _GUID mGuid; public: SmartGuid(_GUID& guid) : mGuid(guid) {} SmartGuid(Guid& guid) : mGuid(Utils::ToGUID(guid)) {} operator Guid() { return Utils::FromGUID(mGuid); } operator _GUID() { return mGuid; } };