|
分類:[Windows 全般]
開発環境:VisualStudio 2008 開発言語:C#
質問させていただきます。
現在印刷アプリケーションを作成しています。 C#言語で開発しているのですが、諸事情により印刷実行はWin32Apiを使用しています。 アプリの機能の一つとして、「印刷途中に印刷設定内容の変更を可能にする」というのを目指しております。 実現のためのシーケンスは以下のような感じです。
1、1ジョブ中に「○ページ目ではxxの印刷設定に変更し、●ページではyyの印刷設定に変更し…」などの設定を行った状態で印刷開始※ 2、指定のページになった段階で、DEVMODEの情報を変更 3、変更後のDEVMODEを反映させるためにResetDC()実行 ※ここでのxxやyyはDEVMODEのPrivate部に定義されてい内容になります。
ソースレベルで言いますと… 1、CreateDC 2、StartDoc -- 指定のページまでは3,4をループ -- 3、StartPage 4、EndPage ------------------指定ページで抜ける-- 5、DEVMODE変更 6、ResetDC 7、3,4のループ 8、EndDoc 9、DeleteDC
という流れになっています。 その中で問題となっているのは「手順6のResetDCを行うと失敗する(戻り値にNULL)」という現象です。 そのためそれ以降の印刷処理が失敗してしまいます。
その原因を調査するにあたり、以下の質問にお答え頂けると助かります。
1、ResetDCの引数は更新対象のデバイスコンテキストのハンドル、更新内容のDEVMODEポインタの二つを渡すと思いますが、第二引数のDEVMODEポインタはprivate部を含むDEVMODEを指すのでしょうか? 2、C#アプリからResetDCでDEVMODEのポインタを渡す場合、内部で同じ構造のDEVMODEを定義しておき、Marshal.StructureToPtrなどでIntPtrに変換して渡す、という処理でいいのでしょうか? 3、ドライバから取得したDEVMODE構造体のサイズとC#で同じ構造体を定義下場合のサイズの比較はどのように行うのでしょうか?(ResetDCの失敗は構造体の不一致のためかどうかの検証のため) 4、そもそもResetDCはEndPageの後で行う、というシーケンスで問題ないのでしょうか? 5、その他留意する点はありますでしょうか?
/****DEVMODEの取得方法****/ IntPtr hDevMode = printDocument.PrinterSettings.GetHdevmode(); IntPtr pDevMode = Win32Api.GlobalLock(hDevMode); DEVMODE dm = (DEVMODE)System.Runtime.InteropServices.Marshal.PtrToStructure(pDevMode, typeof(DEVMODE)); // DEVMODEはアプリ内部で定義しているprivate部を含むDEVMODE構造体です。
長文になり恐縮ですが、ご教授頂ければと思います。
※private部の設定はどのように行っているのか?に関してはソースレベルでの公開は申し訳ないのですが、出来ません。
以上、よろしくお願いいたします。
|