public void SetProperty(WM_ATTR attr) { object obj; uint size; Logger.WriteLogMessage("Set property[" + attr.Name + "]."); switch (attr.DataType) { case WMT_ATTR_DATATYPE.WMT_TYPE_STRING: byte[] arr = Encoding.Unicode.GetBytes((string)attr.Value + (char)0); obj = arr; size = (ushort)arr.Length; break; case WMT_ATTR_DATATYPE.WMT_TYPE_BOOL: obj = (uint)((bool)attr ? 1 : 0); size = 4; break; case WMT_ATTR_DATATYPE.WMT_TYPE_BINARY: obj = (byte[])attr.Value; size = (ushort)((byte[])obj).Length; break; case WMT_ATTR_DATATYPE.WMT_TYPE_DWORD: obj = (uint)attr; size = 4; break; case WMT_ATTR_DATATYPE.WMT_TYPE_QWORD: obj = (ulong)attr; size = 8; break; case WMT_ATTR_DATATYPE.WMT_TYPE_WORD: obj = (ushort)attr; size = 2; break; case WMT_ATTR_DATATYPE.WMT_TYPE_GUID: obj = (Guid)attr; size = (ushort)Marshal.SizeOf(typeof(Guid)); break; default: throw new ArgumentException("Invalid data type.", "attr"); } GCHandle h = GCHandle.Alloc(obj, GCHandleType.Pinned); try { _propertyVault.SetProperty(attr.Name, attr.DataType, h.AddrOfPinnedObject(), size); } finally { h.Free(); } }
private void TestProp() { int i, iLen = 0; AttrDataType pType; byte[] b = null; m_pv.GetPropertyCount(out i); Debug.Assert(i == 0); m_pv.SetProperty("foo", AttrDataType.DWORD, BitConverter.GetBytes(14), 4); m_pv.GetPropertyByName("foo", out pType, b, ref iLen); Debug.Assert(iLen == 4); b = new byte[iLen]; m_pv.GetPropertyByName("foo", out pType, b, ref iLen); Debug.Assert(BitConverter.ToInt32(b, 0) == 14); int isb = 0; b = null; iLen = 0; StringBuilder sb = null; m_pv.GetPropertyByIndex(0, sb, ref isb, out pType, b, ref iLen); Debug.Assert(isb == 4); Debug.Assert(iLen == 4); sb = new StringBuilder(isb); b = new byte[iLen]; m_pv.GetPropertyByIndex(0, sb, ref isb, out pType, b, ref iLen); Debug.Assert(BitConverter.ToInt32(b, 0) == 14); Debug.Assert(sb.ToString() == "foo"); m_pv.Clear(); m_pv.GetPropertyCount(out i); Debug.Assert(i == 0); }