public static VariableType DefineStruct(String name, IDictionary<String, StructMemberInfo> structMembers, int structSize, Tw.SummaryCallback callback, IntPtr clientData)
{
if (name == null) {
throw new ArgumentNullException("name");
} else if (structMembers == null) {
throw new ArgumentNullException("structMembers");
} else if (structSize == 0) {
throw new ArgumentOutOfRangeException("structSize");
}
var structData = new List<NativeMethods.StructMember>();
try
{
foreach (var kv in structMembers) {
IntPtr namePtr = IntPtr.Zero;
IntPtr defPtr = IntPtr.Zero;
if (kv.Key == null) {
throw new ArgumentNullException("", "Member name cannot be null.");
}
if (kv.Value.Def == null) {
throw new ArgumentNullException("", "Member definition string cannot be null.");
}
try
{
namePtr = Helpers.PtrFromStr(kv.Key);
defPtr = Helpers.PtrFromStr(kv.Value.Def);
structData.Add(new NativeMethods.StructMember(
namePtr,
kv.Value.Type,
new UIntPtr((uint)kv.Value.Offset),
defPtr
));
}
catch (Exception)
{
if (namePtr != IntPtr.Zero) {
Marshal.FreeCoTaskMem(namePtr);
}
if (defPtr != IntPtr.Zero) {
Marshal.FreeCoTaskMem(defPtr);
}
throw;
}
}
Tw.VariableType structType = NativeMethods.TwDefineStruct(name, structData.ToArray(),
(uint)structData.Count,
new UIntPtr((uint)structSize),
callback, clientData);
if (structType == VariableType.Undefined) {
throw new AntTweakBarException("TwDefineStruct failed.");
}
return structType;
}
finally
{
foreach (var member in structData) {
Marshal.FreeCoTaskMem(member.Name);
Marshal.FreeCoTaskMem(member.DefString);
}
}
}