// Called just after invoking the COM method. The IntPtr is the same one that just got returned // from MarshalManagedToNative. The return value is unused. public object MarshalNativeToManaged(IntPtr pNativeData) { m_Control.cbStruct = Marshal.ReadInt32(pNativeData); m_Control.dwLineID = Marshal.ReadInt32(pNativeData, 4); m_Control.dwControl = Marshal.ReadInt32(pNativeData, 8); m_Control.cControls = Marshal.ReadInt32(pNativeData, 12); m_Control.cbmxctrl = Marshal.ReadInt32(pNativeData, 16); m_Control.pamxctrl = new MixerControl[m_Control.cControls]; IntPtr pData = new IntPtr(pNativeData.ToInt64() + iMixLineContSize); for (int x = 0; x < m_Control.cControls; x++) { m_Control.pamxctrl[x] = new MixerControl(); IntPtr ip = new IntPtr(pData.ToInt64() + (x * iMixContSize)); Marshal.PtrToStructure(ip, m_Control.pamxctrl[x]); } m_Control = null; return m_Control; }
// It appears this routine is never called public void CleanUpManagedData(object ManagedObj) { m_Control = null; }
public IntPtr MarshalManagedToNative(object managedObj) { IntPtr p; // Cast the object back to a PropVariant m_Control = managedObj as MixerLineControls; if (m_Control != null) { // Create an appropriately sized buffer, blank it, and send it to // the marshaler to make the COM call with. int iSize2 = m_Control.cControls * iMixContSize; p = Marshal.AllocCoTaskMem(iMixLineContSize + iSize2); #if DEBUG for (int x = 0; x < iMixLineContSize + iSize2; x++) { Marshal.WriteByte(p, x, 0xcc); } #endif Marshal.StructureToPtr(m_Control, p, false); Marshal.WriteIntPtr(p, iMixLineContSize - IntPtr.Size, new IntPtr(p.ToInt64() + iMixLineContSize)); } else { p = IntPtr.Zero; } return p; }