我需要更改打印機的當前打印任務的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() - 這個不能編譯 –