2012-01-05 39 views
3

IEの印刷テンプレートは、このプロパティを使用して、ユーザーが印刷ダイアログボックスを閉じた後に選択したプリンタに関する情報を確認します。 Visual C++でコードを持つDEVMODE構造体にこのプロパティを設定するにはどうすればよいですか? DEVMODE構造体をに変換するにはどうすればよいですか?可能であれば、バリアントを印刷テンプレートに渡し、jscriptの__IE_PrinterCmd_DevModeプロパティを設定することができます。__IE_PrinterCmd_DevModeプロパティをVisual C++のIEで印刷テンプレートのDEVMODE構造体に設定する方法

+0

あなたは、このプロパティを設定することはできませんで、それは読み取り専用です。 –

+0

印刷テンプレートは読み取り専用です。しかし、印刷ダイアログボックスで設定されています。私は、カスタム印刷ダイアログボックスを実装したいと思って、このプロパティを通して印刷テンプレートにユーザ設定を渡したいと思っています。 –

答えて

3

Marc Durdinは、デルファイの詳細な例を持つ優れたブログ記事を持っています。特に

Demystifying printing with the Microsoft WebBrowser control and ShowHTMLDialogEx

__IE_PrinterCmd_DevModeのロックが解除HGLOBALGlobalAllocまたはGlobalReAllocから一般的に有効な戻り値)でなければなりません:それは、C++や他の言語へ簡単に移植です。これはどこにも記載されていません。私は、PrintDlgへの呼び出しで直接提供されたように、PRINTDLG.hDevMode and PRINTDLG.hDevNamesフィールドの値を使って作業することを最終的に試行錯誤してマークを見つけたと思います。

私は、テンプレートのスクリプトに整数としてHGLOBAL Sを渡すとTemplatePrinterを作成する前に、__IE_PrinterCmd_DevMode__IE_PrinterCmd_DevNamesを初期化するためにそれらを使用することができました。これはShowHTMLDialogExに電話したくない場合に便利です。アプリケーションにはすでにフックがあります。元のウィンドウのexternalスクリプトオブジェクトを使用しています。テンプレートからアクセスするには、私が使用します。

dialogArguments.__IE_BrowseDocument.parentWindow.external 

PS:整数のJScriptの数字は、最大シーケンシャル整数を表すことができ、実際には二重の山車であるため、32ビットプロセスで動作としてHGLOBALを渡します53ビット。しかし、この制限のため、HGLOBALを64ビットプロセスで整数として渡すことは信頼性がありません。

たぶん、あなたはあなたのwindow.externalオブジェクトが整数VARIANT S(VT_I8またはVT_UI8)と__IE_PrinterCmd_DevMode__IE_PrinterCmd_DevNamesを設定し、印刷テンプレートのdialogArgumentsオブジェクトを、期待する方法を持たせることができます。

まだテストしていません。

システムのデフォルト以外のプリンタを選択したい場合は、__IE_PrinterCMD_Printerプロパティを設定することもできます。 JScriptでこれを行うことができます。設定した後に作成する動作オブジェクトのTemplatePrinterに影響します。ただし、このプロパティだけでは、初期設定を制御したり、ユーザーが最終的に選択したプリンタを知ることはできません。

1

私はちょうど同じ問題を抱えており、__IE_PrinterCmd_DevModeと__IE_PrinterCmd_DevNamesはIntPtrから設定できることがわかりました。

これはX86アプリケーション上にあるため、x64またはAnyCPUで何が起こるかは不明です。

私はクラスを使用して、外部オブジェクトを通じてDevModeとDevNamesを渡します。

はここで、このために、コードの主要部分です:

Public Class PrintObjCls 
Public Printer As String 
Public DevMode As IntPtr 
Public DevNames As IntPtr 
Public Printing As Boolean 
Public Failed As Boolean 
Public Progress As Integer 
End Class 

Sub PrintToTemplate(Web as WebBrowser, Settings as PrinterSettings) 
Dim Obj As New PrintObjCls 
Obj.Printer = Settings.PrinterName 
Obj.DevMode = Settings.GetHdevmode 
Obj.DevNames = Settings.GetHdevnames 
Web.ObjectForScripting = Obj 
End Sub 

を次に印刷テンプレート

var ext = doc.parentWindow.external; 
dialogArguments.__IE_PrinterCMD_Printer = ext.Printer; 
dialogArguments.__IE_PrinterCmd_DevMode = ext.DevMode; 
dialogArguments.__IE_PrinterCmd_DevNames = ext.DevNames; 
+0

これは答えのようには聞こえませんか? –

+0

正直、時にはトロールはちょうど待つことができない!これは、DevModeを印刷テンプレートに渡す方法の答えです – AndrewC

関連する問題