Ejemplo n.º 1
0
            public static CoTaskStringSafeHandle FromPointer(IntPtr pointer)
            {
                var r = new CoTaskStringSafeHandle();

                r.SetHandle(pointer);
                return(r);
            }
Ejemplo n.º 2
0
            public unsafe string[] ToStringVector()
            {
                if (IsInvalid)
                {
                    throw new InvalidOperationException("The handle is invalid.");
                }

                if (VarType == (VarEnum.VT_VECTOR | VarEnum.VT_LPWSTR))
                {
                    var vector = (CALPWSTR *)(handle + 8);
                    var cElems = vector->cElems;
                    if (cElems == 0)
                    {
                        return(Array.Empty <string>());
                    }

                    var r = new string[cElems];
                    var currentElementPointer = *vector->pElems;

                    for (var i = 0; i < r.Length; i++)
                    {
                        r[i] = new string(currentElementPointer);
                        currentElementPointer++;
                    }

                    return(r);
                }
                else if (PropVariantToStringVectorAlloc(this, out var buffer, out var cElems).Code != WinErrorCode.InvalidParameter)
                {
                    using (buffer)
                    {
                        if (cElems == 0)
                        {
                            return(Array.Empty <string>());
                        }

                        var mustRelease = true;
                        buffer.DangerousAddRef(ref mustRelease);
                        try
                        {
                            var r = new string[cElems];
                            var currentElementPointer = (IntPtr *)buffer.DangerousGetHandle();

                            for (var i = 0; i < r.Length; i++)
                            {
                                r[i] = CoTaskStringSafeHandle.FromPointer(*currentElementPointer).ReadAndFree();
                                currentElementPointer++;
                            }

                            return(r);
                        }
                        finally
                        {
                            if (mustRelease)
                            {
                                buffer.DangerousRelease();
                            }
                        }
                    }
                }

                throw new NotImplementedException(VarType.ToString());
            }