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());
                }
            }
        }
示例#2
0
            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);
            }