• 締切済み

PRINTDLGでのプリンタ設定について

開発環境:WINDOWS2000 VB6 SP6 こんにちわ。 分からない事が出てきましたので、また皆さんのお知恵をお借りできればと思います。 PRINTDLG関数で、プリンタの設定をユーザーにしてもらい、その設定を印刷に適用したいと思います。 下記のサイトを参考にして作ってみました。 http://www.itmedia.co.jp/help/howto/win/win2000/0007special/complus_vb/chap7/62.html 実行させてみると、プリンタの設定ダイログが表示され、設定も変更でき、印刷にも反映させることができました。 しかし、設定を再び変更しようとプリンタ設定ダイアログを開いた場合、以前の設定を渡しているはずなのですが、プリンタ名以外が反映されず、デフォルトの設定になってしまいます。(給紙方法や印刷の向きなど) 文字数制限により、問題と思われる部分のソースのみ書かせてもらいます。 hDevMode = GlobalAlloc(GHND, Len(vDevMode)) lpDevMode = GlobalLock(hDevMode) CopyMemory ByVal lpDevMode, vDevMode, Len(vDevMode) GlobalUnlock lpDevMode hDevNames = GlobalAlloc(GHND, Len(vDevNames)) lpDevNames = GlobalLock(hDevNames) CopyMemory ByVal lpDevNames, vDevNames, Len(vDevNames) GlobalUnlock lpDevNames vPrintDlg.lStructSize = Len(vPrintDlg) vPrintDlg.hwndOwner = FormHwnd vPrintDlg.hDevMode = hDevMode vPrintDlg.hDevNames = hDevNames vPrintDlg.Flags = 64 色々試してみたところ、vPrintDlg構造体のhDevModeに何も渡さずに実行しても、プリンタ名は反映されていました。 vPrintDlg構造体のhDevModeに、きちんとvdevModeが渡せていないというのが有力になってきたのですが、おかしいところが見当たらず、お手上げ状態になっています。 何でもいいのでよろしくお願い致します。

みんなの回答

  • jmh
  • ベストアンサー率23% (71/304)
回答No.1

vDevMode.dmDriverExtra の値は何ですか?

takeru427
質問者

お礼

アドバイスありがとうございます。 無事解決しましたので、締め切らせて頂きます。 有難うございました。

takeru427
質問者

補足

アドバイスありがとうございます。 vDevMode.dmDriverExtra の値ですが、設定していませんので、0になっています。 あれから色々調べた所、他のプリンタではきちんと設定が反映されていて、 特定のプリンタのみが反映されていないようです。 jmhさんの推測通り、プリンタの拡張機能の部分に問題があるように思います。 vDevMode.dmDriverExtraの値の設定の仕方が現在わからず、調べております。 DEVMODE構造体の定義は、下記になっています。 Public Type DEVMODE dmDeviceName As String * CCHDEVICENAME dmSpecVersion As Integer dmDriverVersion As Integer dmSize As Integer dmDriverExtra As Integer dmFields As Long dmOrientation As Integer dmPaperSize As Integer dmPaperLength As Integer dmPaperWidth As Integer dmScale As Integer dmCopies As Integer dmDefaultSource As Integer dmPrintQuality As Integer dmColor As Integer dmDuplex As Integer dmYResolution As Integer dmTTOption As Integer dmCollate As Integer dmFormName As String * CCHFORMNAME dmLogPixels As Integer dmBitsPerPel As Long dmPelsWidth As Long dmPelsHeight As Long dmDisplayFlags As Long dmDisplayFrequency As Long End Type 話は変わりますが、PRINTDLGEXであれば上手くいくのではないかと試していたのですが、参考となるサンプルがなく、模索中です。 また何かアドバイスがございましたら、よろしくお願いします。

関連するQ&A

  • 【VB6】印刷ダイアログの表示を繰り返すと異常終了

    開発言語:VB6 お世話になります。 DEVMODE構造体とDEVNAME構造体に、プリンタや用紙サイズ、印刷の向きなどを指定し、Win32APIのPrintDialogで印刷ダイアログを表示しています。 この処理を何回か呼び出すと、プログラムが異常終了します。 異常終了する場所は、PrintDialogを呼び出した直後だと思われます。 いろいろ調べたのですが、原因がわかりません。 長くなりますが、ソースコードの一部を添付させて頂きます。 ご覧頂き、おかしい点などございましたらご指摘いただけるとありがたいです。 よろしくお願いします。 以下ソースコード ----------------------------------------------------------------------------------- PrintDlg.lStructSize = Len(PrintDlg) PrintDlg.hwndOwner = phwnd PrintDlg.flags = plngPrintFlags strDeviceName = Printer.DeviceName strDriverName = Printer.DriverName sngPaperBin = Printer.PaperBin strPortNo = Printer.Port If mstrDriverName <> "" And _ mstrDeviceName <> "" And _ mstrPortNo <> "" Or _ msngDefaultSource <> 0 Then For Each objPrinter In Printers If objPrinter.DeviceName = mstrDeviceName Then strDeviceName = mstrDeviceName strDriverName = mstrDriverName sngPaperBin = msngDefaultSource strPortNo = mstrPortNo Exit For End If Next End If udtPrinterDefaults.DesiredAccess = PRINTER_ACCESS_USE If OpenPrinter(Trim(strDeviceName), hPrinter, udtPrinterDefaults) <> 0 Then bufSize = DocumentProperties(NULLPTR, hPrinter, Trim(strDeviceName), NULLPTR, NULLPTR, 0) If bufSize < 1 Then MsgBox "プリンタ情報の取得に失敗しました。", vbCritical GoTo Exit_Proc Else ReDim aDevMode(bufSize - 1) Call DocumentProperties(NULLPTR, hPrinter, Trim(strDeviceName), aDevMode(0), NULLPTR, DM_OUT_BUFFER) Call CopyMemory(DevMode, aDevMode(0), Len(DevMode)) End If Call ClosePrinter(hPrinter) Else MsgBox Err.LastDllError MsgBox "プリンタの取得に失敗しました。", vbCritical GoTo Exit_Proc End If DevMode.dmPaperSize = mintPaperSize DevMode.dmOrientation = mintPaperOrnt DevMode.dmDefaultSource = sngPaperBin PrintDlg.hDevMode = GlobalAlloc(GMEM_MOVEABLE Or GMEM_ZEROINIT, Len(DevMode)) lpDevMode = GlobalLock(PrintDlg.hDevMode) If lpDevMode > 0 Then CopyMemory ByVal lpDevMode, DevMode, Len(DevMode) bReturn = GlobalUnlock(lpDevMode) End If With DevName .wDriverOffset = 8 .wDeviceOffset = .wDriverOffset + 1 + Len(strDriverName) .wOutputOffset = .wDeviceOffset + 1 + Len(strDeviceName) .wDefault = 0 .extra = strDriverName & Chr(0) & strDeviceName & Chr(0) & strPortNo & Chr(0) End With PrintDlg.hDevNames = GlobalAlloc(GMEM_MOVEABLE Or _ GMEM_ZEROINIT, Len(DevName)) lpDevName = GlobalLock(PrintDlg.hDevNames) If lpDevName > 0 Then CopyMemory ByVal lpDevName, DevName, Len(DevName) bReturn = GlobalUnlock(lpDevName) End If If PrintDialog(PrintDlg) Then mhDC = PrintDlg.hdc lpDevName = GlobalLock(PrintDlg.hDevNames) CopyMemory DevName, ByVal lpDevName, Len(DevName) bReturn = GlobalUnlock(lpDevName) GlobalFree PrintDlg.hDevNames lpDevMode = GlobalLock(PrintDlg.hDevMode) CopyMemory DevMode, ByVal lpDevMode, Len(DevMode) bReturn = GlobalUnlock(PrintDlg.hDevMode) GlobalFree PrintDlg.hDevMode mstrDriverName = Mid(DevName.extra, DevName.wDriverOffset - 8 + 1) mstrDriverName = Left(mstrDriverName, InStr(mstrDriverName, Chr(0)) - 1) mstrDeviceName = Mid(DevName.extra, DevName.wDeviceOffset - 8 + 1) mstrDeviceName = Left(mstrDeviceName, InStr(mstrDeviceName, Chr(0)) - 1) mstrPortNo = Mid(DevName.extra, DevName.wOutputOffset - 8 + 1) mstrPortNo = Left(mstrPortNo, InStr(mstrPortNo, Chr(0)) - 1) msngDefaultSource = DevMode.dmDefaultSource mintPaperOrnt = DevMode.dmOrientation mintPaperSize = DevMode.dmPaperSize gfShowPrinter = True End If

  • PrintUIEntryを使ってプリンタ設定

    windowsXP使用のPCでPrintUIEntryを使ってプリンタの設定をしているのですが、EPSON LP-6500の印刷設定がパラメータ/Sr(プリンタ設定を復元)を実行しても反映されずに困っています。 何方かわかる方がいらっしゃったらアドバイスお願いします。

  • プリンタの設定がきえます。

    LAN内でネットワークプリンタを利用して印刷を行っています。 数日前まで、問題なく利用できていたのですが、 ここへきて突然、印刷出来なくなる人が多発しています。 マシンを再起動すると、また印刷できるのですが 何枚か印刷すると、また印刷できなくなります。 印刷できなくなったときは 「コントロールパネル」→「プリンタ」から 設定したプリンタが消え、「プリンタの追加」しかありません。 再起動すると、設定したプリンタが復活し、印刷できます。 現在、対処方法として「再起動」をお願いしているのですが、 苦情が殺到しています。どうすれば利用できますか? なお、OSは Win98, Win95など様々・・・ プリンタ Canon LaserShot 910,720など・・・

  • WindowsXPプリンタ共有設定ができない

    OS:WindowsXP プリンタ:CanonLBP3980 上記プリンタに端末を1台USBケーブルで接続し、複数の端末から上記プリンタに印刷 したいです。 親端末(プリンタと接続)の設定に、共有設定を行い、子端末の設定はローカルポートを作成 (\\親端末のホスト名\共有名)の設定をするのみで印刷可能と認識していますが、子端末 から印刷を実行した際、印刷できません。状況としては、子端末で設定したポートが親端末 にも反映されておるという状況です。 ※親端末で設定した内容もすべて子端末に反映されてしまいます・・。 設定の仕方がおかしいのでしょうか。 他に設定する箇所があるのでしょうか。 急ぎでのご回答を希望致します。

  • プリンター設定について

    プリンターPX-F886MLを数年前より使用しておりますが、最近、用紙設定などの印刷等に関わる各種設定で一部、一度設定してもその設定が反映されません。 どの様に操作しましたら、設定が反映されるようになるのでしょうか? ※OKWAVEより補足:「EPSON社製品」についての質問です。

  • VB6でのプリンタ設定について

    メモ帳等のように通常使うプリンタを変更することなく、アプリが起動している間は 任意のプリンタを選択することが出来、アプリ専用のプリンタ設定を保持するには どうしたらいいでしょう。 1.OpenPrinter 2.GetPrinter で PRINTER_INFO_2 から DEVMODE を取得 3.DEVNAMES を設定 4.PRINTDLG で設定画面を表示 上記の手順でプリントダイアログを表示するとこまでは出来ましたが ここで設定された情報を Printer オブジェクトに反映させる方法がわかりません。 ResetDC だと色、用紙の向きなど基本的なものは反映されましたがプリンタ固有の 情報(スタンプマークなど)までは反映されませんでした。 SetPrinter だとすべての情報が反映されましたが通常使うプリンタの設定まで 変わってしまいました。 わかりづらい部分が多々あるとは思いますが、どなたか教えていただけませんでしょうか よろしくお願いします。 VB6 XP SP2

  • Visual Basicから、プリンタの印刷設定を変更する方法。

    Visual Basicから、プリンタドライバの印刷設定をする方法を探しているのですが、つまづいています。 環境は Windows2000(SP4) VB6(SP5) です。 具体的にはエプソンのページプリンタ(LP-2400/2500/9100/9300)で、 出力用紙固定(A4)の拡大/縮小印刷を設定する方法です。 まず、APIのDocumentPropatiesを利用しようと思ったのですが、 これでは倍率指定による拡大/縮小しかできず、 また、なぜか変更しても結果が印刷設定に反映されません。 続いて、EPSONから提供されているEPDIを利用しようとしたのですが、 これだと、期待する情報(出力する用紙サイズ指定の拡大/縮小)を取得できるものの、 変更し、反映しようとしても、これまた結果が印刷設定に反映されません。 何かいい方法はないでしょうか。

  • エクセルでブックごとにプリンタを設定したい

    職場で印刷するものによってプリンタを使い分けているのですが、ブックごとにプリンタを設定しておけないものでしょうか? 現在通常使っているプリンタAが標準の設定になっているのですが、プリンタBで印刷したいドキュメントを印刷するときには、そのつど設定を変えてやらなければいけません。 ひとつのブックでプリンタを変えるとすべてのエクセルデータに反映されてしまいますが、それでも一度エクセルを終了するとまたAに設定されています。  このちょっとした歯がゆさから開放されたいです。どなたか教えていただけたら助かります。

  • プリンターの設定

    FMV XPノートです。今回CANONプリンターを購入しました。印刷ダイアログからプロパティーで、印刷前にプレビュー、カラーマニュアル設定を変更しましたが、その時は反映されますが、後日元に戻っているのが分かりました。これはどういう事でしょうか?教えて下さい。

  • プリンターの設定が反映されない。

    初めまして、どうぞよろしくお願いします。 プリンターはCanon の BJ F660を使用しています。 印刷設定を白黒設定からカラー設定に直すと、カラーで印刷されるハズなのですが設定が変わらず白黒のままで印刷されてしまいます。 そして、再起動すると設定が反映されカラーで印刷されます。 ケーブル接続などの初歩的ミスは確認しました、どうしたらすぐ反映されるようになれますか? PCの仕様は、OSはXPのSP2でDELL DIMENSION8300のPentium4 CPU2.80GHz 512MB RAMです。 どうか、ご教授お願い致します。

専門家に質問してみよう