private static void ToPtr(IntPtr pos, NotifyOptions options) { PRINTER_NOTIFY_OPTIONS st; st.Flags = options.Flags; st.Count = (uint)options.Types.Count; st.Version = 2; st.pTypes = pos + Marshal.SizeOf <PRINTER_NOTIFY_OPTIONS>(); Marshal.StructureToPtr(st, pos, false); pos += Marshal.SizeOf <PRINTER_NOTIFY_OPTIONS>(); var fieldsPos = pos + (options.Types.Count * Marshal.SizeOf <PRINTER_NOTIFY_OPTIONS_TYPE>()); foreach (var optionsType in options.Types) { PRINTER_NOTIFY_OPTIONS_TYPE str = default; str.Type = (UInt16)optionsType.Type; str.Count = (UInt32)optionsType.Fields.Count; str.pFields = fieldsPos; Marshal.StructureToPtr(str, pos, false); pos += Marshal.SizeOf <PRINTER_NOTIFY_OPTIONS_TYPE>(); foreach (var field in optionsType.Fields) { Marshal.WriteInt32(fieldsPos, field); fieldsPos += Marshal.SizeOf(field.GetType()); } } }
public PRINTER_NOTIFY_OPTIONS() { int bytesNeeded = (2 + PRINTER_NOTIFY_OPTIONS_TYPE.JOB_FIELDS_COUNT + PRINTER_NOTIFY_OPTIONS_TYPE.PRINTER_FIELDS_COUNT) * 2; PRINTER_NOTIFY_OPTIONS_TYPE pJobTypes = new PRINTER_NOTIFY_OPTIONS_TYPE(); lpTypes = Marshal.AllocHGlobal(bytesNeeded); Marshal.StructureToPtr(pJobTypes, lpTypes, true); }