I have declared the PrinterNotifyInfo structure that it wants in as a class thus:

VB Code:
  1. Imports System.Runtime.InteropServices
  2.  
  3.  
  4. <StructLayout(LayoutKind.Explicit)> _
  5. Public Class PrinterNotifyOptions
  6.     <FieldOffset(0)> Public dwVersion As Integer
  7.     <FieldOffset(4)> Public dwFlags As Integer
  8.     <FieldOffset(8)> Public Count As Integer
  9.     '\\ --JOB_NOTIFY_OPTIONS_TYPE
  10.     <FieldOffset(12)> Public wType As Int16
  11.     <FieldOffset(14)> Public wReserved0 As Int16
  12.     <FieldOffset(16)> Public dwReserved1 As Int32
  13.     <FieldOffset(20)> Public dwReserved2 As Int32
  14.     <FieldOffset(24)> Public FieldCount As Int32
  15.     <FieldOffset(28)> Public pFields As IntPtr
  16.  
  17. #Region "Public Enumerated Types"
  18.     Public Enum Printer_Notification_Types
  19.         PRINTER_NOTIFY_TYPE = &H0
  20.         JOB_NOTIFY_TYPE = &H1
  21.     End Enum
  22.  
  23.     Public Enum Printer_Notify_Field_Indexes
  24.         PRINTER_NOTIFY_FIELD_SERVER_NAME = &H0
  25.         PRINTER_NOTIFY_FIELD_PRINTER_NAME = &H1
  26.         PRINTER_NOTIFY_FIELD_SHARE_NAME = &H2
  27.         PRINTER_NOTIFY_FIELD_PORT_NAME = &H3
  28.         PRINTER_NOTIFY_FIELD_DRIVER_NAME = &H4
  29.         PRINTER_NOTIFY_FIELD_COMMENT = &H5
  30.         PRINTER_NOTIFY_FIELD_LOCATION = &H6
  31.         PRINTER_NOTIFY_FIELD_DEVMODE = &H7
  32.         PRINTER_NOTIFY_FIELD_SEPFILE = &H8
  33.         PRINTER_NOTIFY_FIELD_PRINT_PROCESSOR = &H9
  34.         PRINTER_NOTIFY_FIELD_PARAMETERS = &HA
  35.         PRINTER_NOTIFY_FIELD_DATATYPE = &HB
  36.         PRINTER_NOTIFY_FIELD_SECURITY_DESCRIPTOR = &HC
  37.         PRINTER_NOTIFY_FIELD_ATTRIBUTES = &HD
  38.         PRINTER_NOTIFY_FIELD_PRIORITY = &HE
  39.         PRINTER_NOTIFY_FIELD_DEFAULT_PRIORITY = &HF
  40.         PRINTER_NOTIFY_FIELD_START_TIME = &H10
  41.         PRINTER_NOTIFY_FIELD_UNTIL_TIME = &H11
  42.         PRINTER_NOTIFY_FIELD_STATUS = &H12
  43.         PRINTER_NOTIFY_FIELD_STATUS_STRING = &H13
  44.         PRINTER_NOTIFY_FIELD_CJOBS = &H14
  45.         PRINTER_NOTIFY_FIELD_AVERAGE_PPM = &H15
  46.         PRINTER_NOTIFY_FIELD_TOTAL_PAGES = &H16
  47.         PRINTER_NOTIFY_FIELD_PAGES_PRINTED = &H17
  48.         PRINTER_NOTIFY_FIELD_TOTAL_BYTES = &H18
  49.         PRINTER_NOTIFY_FIELD_BYTES_PRINTED = &H19
  50.         PRINTER_NOTIFY_FIELD_OBJECT_GUID = &H1A
  51.     End Enum
  52.  
  53.     Public Enum Job_Notify_Field_Indexes
  54.         JOB_NOTIFY_FIELD_PRINTER_NAME = &H0
  55.         JOB_NOTIFY_FIELD_MACHINE_NAME = &H1
  56.         JOB_NOTIFY_FIELD_PORT_NAME = &H2
  57.         JOB_NOTIFY_FIELD_USER_NAME = &H3
  58.         JOB_NOTIFY_FIELD_NOTIFY_NAME = &H4
  59.         JOB_NOTIFY_FIELD_DATATYPE = &H5
  60.         JOB_NOTIFY_FIELD_PRINT_PROCESSOR = &H6
  61.         JOB_NOTIFY_FIELD_PARAMETERS = &H7
  62.         JOB_NOTIFY_FIELD_DRIVER_NAME = &H8
  63.         JOB_NOTIFY_FIELD_DEVMODE = &H9
  64.         JOB_NOTIFY_FIELD_STATUS = &HA
  65.         JOB_NOTIFY_FIELD_STATUS_STRING = &HB
  66.         JOB_NOTIFY_FIELD_SECURITY_DESCRIPTOR = &HC
  67.         JOB_NOTIFY_FIELD_DOCUMENT = &HD
  68.         JOB_NOTIFY_FIELD_PRIORITY = &HE
  69.         JOB_NOTIFY_FIELD_POSITION = &HF
  70.         JOB_NOTIFY_FIELD_SUBMITTED = &H10
  71.         JOB_NOTIFY_FIELD_START_TIME = &H11
  72.         JOB_NOTIFY_FIELD_UNTIL_TIME = &H12
  73.         JOB_NOTIFY_FIELD_TIME = &H13
  74.         JOB_NOTIFY_FIELD_TOTAL_PAGES = &H14
  75.         JOB_NOTIFY_FIELD_PAGES_PRINTED = &H15
  76.         JOB_NOTIFY_FIELD_TOTAL_BYTES = &H16
  77.         JOB_NOTIFY_FIELD_BYTES_PRINTED = &H17
  78.     End Enum
  79.  
  80. #End Region
  81.  
  82.     Public Sub New()
  83.  
  84.  
  85.         '\\ As it stands, version is always 2
  86.         dwVersion = 2
  87.         '\\ We must have at least one notification - status makes sense to test with...
  88.         'NotifyJobStatus = True
  89.         FieldCount = 1
  90.         Dim pfld1 As Short = Job_Notify_Field_Indexes.JOB_NOTIFY_FIELD_STATUS
  91.  
  92.         '\\ Use pointer to array per your suggestion...
  93.         pFields = Marshal.AllocHGlobal(2)
  94.         Marshal.WriteInt16(pFields, 0, pfld1)
  95.  
  96.     End Sub
  97.  
  98. End Class

And when I pass it to FindFirstPrinterChangeNotification it goes OK but when a print job occurs and the wait object triggers I have to call FindNextPrinterChangeNotification to get the info that has changed which I have declared thus:-
VB Code:
  1. <DllImport("winspool.drv", EntryPoint:="FindNextPrinterChangeNotification", _
  2.     SetLastError:=True, CharSet:=CharSet.Ansi, _
  3.     ExactSpelling:=True, _
  4.     CallingConvention:=CallingConvention.StdCall)> _
  5.     Public Shared Function FindNextPrinterChangeNotification _
  6.                             (<InAttribute()> ByVal hChangeObject As IntPtr, _
  7.                              <OutAttribute()> ByRef pdwChange As IntPtr, _
  8.                              <InAttribute()> ByVal pPrinterNotifyOptions As PrinterNotifyOptions, _
  9.                              <OutAttribute()> ByRef lppPrinterNotifyInfo As IntPtr _
  10.                                  ) As Boolean
  11.  
  12.     End Function

Now when this is called the variable pdwChange is filled with the correct value to indicate what has changed but lppPrinterNotifyInfo is never non-zero.

Any thoughts at all?

Thanks in advance,
Duncan