Мне нужно изменить DEVMODE
принтера для текущей задачи печати, чтобы пройти стандартные и специфичные для устройства настройки. Я делаю следующее:
PrintDocument d = new PrintDocument();
d.PrinterSettings.PrinterName = "Microsoft XPS Document Writer"; // example printer name
byte[] devmode_data; // contains a valid value that is obtained from registry
IntPtr devmode = IntPtr.Zero;
GCHandle handle = GCHandle.Alloc(devmode_data, GCHandleType.Pinned);
try
{
devmode = handle.AddrOfPinnedObject();
if (devmode != IntPtr.Zero) d.PrinterSettings.SetHdevmode(devmode);
}
finally
{
if (handle.IsAllocated) handle.Free();
}
Сбой при попытке выполнить PrinterSettings.SetHdevmode
с NullReferenceException
и без какой-либо значимой информации об ошибке. d.PrinterSettings
не равно нулю, исключение выдается внутри метода PrinterSettings.SetHdevmode
.
Итак, мой вопрос: что не так? Неправильно ли кастуется от byte[]
до IntPtr
? Может быть, SetHdevmode
ожидает что-то иное, чем массив byte[]
?
Я получаю массив byte[] devmode_data
из реестра. Это допустимое значение, которое используется в текущих настройках принтера.