我需要更改打印机的当前打印任务的DEVMODE
以通过标准和设备特定的设置。我做到以下几点:无法更改打印机的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();
}
当我尝试用NullReferenceException
,没有任何有意义的错误信息,以执行PrinterSettings.SetHdevmode
它失败。 d.PrinterSettings
不为空,抛出异常的方法是PrinterSettings.SetHdevmode
。
所以我的问题是:什么是错的?铸造错误是byte[]
到IntPtr
?也许SetHdevmode
期望byte[]
数组以外的东西?我得到byte[] devmode_data
数组从注册表中。这是一个有效值,它与当前打印机设置中使用的值相同。
如何将PrinterSettings.GetHdevmode()转换为有意义的东西?我试过GCHandle.FromIntPtr(),然后处理。目标,但是会引发异常。 –
只要你知道你想要的结构体的大小,你就可以声明一个字节数组,然后把它转换为指针,'(byte [] *)devmode.ToPointer()'。 –
(byte [] *)devmode.ToPointer() - 这个不能编译 –