#pragma once

#include "il2cpp-config.h"
#include "il2cpp-object-internals.h"

namespace il2cpp
{
namespace os
{
    class COM
    {
    public:
        static il2cpp_hresult_t CreateInstance(const Il2CppGuid& clsid, Il2CppIUnknown** object);
        static il2cpp_hresult_t CreateFreeThreadedMarshaler(Il2CppIUnknown* outer, Il2CppIUnknown** marshal);

        // variant

        static void VariantInit(Il2CppVariant* variant);
        static il2cpp_hresult_t VariantClear(Il2CppVariant* variant);

        // safe array

        static Il2CppSafeArray* SafeArrayCreate(uint16_t type, uint32_t dimension_count, Il2CppSafeArrayBound* bounds);
        static il2cpp_hresult_t SafeArrayDestroy(Il2CppSafeArray* safeArray);
        static il2cpp_hresult_t SafeArrayAccessData(Il2CppSafeArray* safeArray, void** data);
        static il2cpp_hresult_t SafeArrayUnaccessData(Il2CppSafeArray* safeArray);
        static il2cpp_hresult_t SafeArrayGetVartype(Il2CppSafeArray* safeArray, uint16_t* type);
        static uint32_t SafeArrayGetDim(Il2CppSafeArray* safeArray);
        static il2cpp_hresult_t SafeArrayGetLBound(Il2CppSafeArray* safeArray, uint32_t dimention, int32_t* bound);
        static il2cpp_hresult_t SafeArrayGetUBound(Il2CppSafeArray* safeArray, uint32_t dimention, int32_t* bound);
    };
} /* namespace os */
} /* namespace il2cpp*/
#pragma once
