public static CoTaskStringSafeHandle FromPointer(IntPtr pointer) { var r = new CoTaskStringSafeHandle(); r.SetHandle(pointer); return(r); }
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()); }