上一次使用 P/Invoke 已經是好多年前了,這次碰到印表機紙張設定的問題,雖然網路上已經有善心人士提供程式碼,但仍花了不少時間抓蟲、註解、縫縫補補的。
參考範例來源:http://blog.csdn.net/csui2008/article/details/5718461。
我在測試過程中陸續刪改、修正,把一些會出錯的部分拿掉,目前已在 Windows 7 x64 和 Windows Server 2008 x64 測試過,可成功修改特定印表機的預設紙張大小。開發工具是 Visual Studio 2012,目標平台為 .NET Framework 4。
測試過程中有些峰迴路轉,無須贅述,但有一點必須記下:原始範例在呼叫 OpenPrinter 時的寫法,有時會出現記憶體非法存取的錯誤:AccessViolationException。這個「有時」非常討厭,剛開始以為寫完了,整合測試時卻出現問題,時有時無,捉摸不定。解謎過程中還試過 <netfx40_pinvokestackresilience>,但最後發現與它無關。
會需要用到這樣低階控制印表機設定的場合大概不多吧,但萬一真碰到了,現成的、可運行的 code 還是可以節省不少時間。相對地,粗糙的範例也會增加更多除錯時間,請務必小心服用(這冤枉路我走過不只一次,屢試不爽 Orz)。
我修改的版本在這裡:https://gist.github.com/huanlin/5671168
其中包括 PrinterHelper.cs 以及一個示範如何使用 PrinterHelper 的 Example.cs。
肯定還有一些可以改進和需要測試的地方,但目前就先這樣吧!
參考範例來源:http://blog.csdn.net/csui2008/article/details/5718461。
我在測試過程中陸續刪改、修正,把一些會出錯的部分拿掉,目前已在 Windows 7 x64 和 Windows Server 2008 x64 測試過,可成功修改特定印表機的預設紙張大小。開發工具是 Visual Studio 2012,目標平台為 .NET Framework 4。
註:我碰到的狀況,PrintDocument 並不適用,只好利用 P/Invoke。
測試過程中有些峰迴路轉,無須贅述,但有一點必須記下:原始範例在呼叫 OpenPrinter 時的寫法,有時會出現記憶體非法存取的錯誤:AccessViolationException。這個「有時」非常討厭,剛開始以為寫完了,整合測試時卻出現問題,時有時無,捉摸不定。解謎過程中還試過 <netfx40_pinvokestackresilience>,但最後發現與它無關。
會需要用到這樣低階控制印表機設定的場合大概不多吧,但萬一真碰到了,現成的、可運行的 code 還是可以節省不少時間。相對地,粗糙的範例也會增加更多除錯時間,請務必小心服用(這冤枉路我走過不只一次,屢試不爽 Orz)。
我修改的版本在這裡:https://gist.github.com/huanlin/5671168
其中包括 PrinterHelper.cs 以及一個示範如何使用 PrinterHelper 的 Example.cs。
肯定還有一些可以改進和需要測試的地方,但目前就先這樣吧!
沒有留言: