У меня есть пара предложений.
Прежде всего _NotifyData
- это объединение, которое должно выглядеть следующим образом:
[StructLayout(LayoutKind.Explicit)]
public struct _NotifyData
{
[FieldOffset(0), MarshalAs(UnmanagedType.ByValArray, SizeConst=2)]
public uint[] adwData;
[FieldOffset(0)]
public struct Data
{
uint cbBuf;
IntPtr pBuff;
}
}
Во-вторых, PRINTER_NOTIFY_INFO
просто не может бытьобрабатывается маршаллером P / invoke.Вам придется использовать ручную сортировку, т. Е. Marshal.PtrToStructure()
, чтобы добраться куда угодно.Документация для параметра ppPrinterNotifyInfo
для FindNextPrinterChangeNotification()
гласит:
Указатель на переменную-указатель, которая получает указатель на выделенный системой буфер только для чтения.Вызовите функцию FreePrinterNotifyInfo, чтобы освободить буфер, когда вы закончите с ним.Этот параметр может иметь значение NULL, если информация не требуется.
Вы должны передать IntPtr
в качестве параметра out
и затем использовать Marshal.PtrToStructure()
для считывания содержимого в свои собственные структуры данных.Примерно так:
IntPtr PrinterNotifyInfo;
FindNextPrinterChangeNotification(..., out PrinterNotifyInfo);
IntPtr pCount = PrinterNotifyInfo + 2*Marshal.SizeOf(typeof(uint));
uint Count = (uint)Marshal.ReadInt32(pCount);
IntPtr pData = pCount + Marshal.SizeOf(typeof(uint));
for (int i=0; i<Count; i++)
{
PRINTER_NOTIFY_INFO_DATA Data = (PRINTER_NOTIFY_INFO_DATA)Marshal.PtrToStructure(pData, typeof(PRINTER_NOTIFY_INFO_DATA));
pData += Marshal.SizeOf(typeof(PRINTER_NOTIFY_INFO_DATA));
}
Я не пытался это скомпилировать, но, надеюсь, это поможет понять идею.