none
【VB6】一部のプリンタでWinAPIの印刷ダイアログが表示されない RRS feed

  • 質問

  • 開発環境:VB6+WinXP

    お世話になります。

    WinAPIの印刷ダイアログを使用して、プリンタ情報の取得を行っているのですが、一部のプリンタにおいて、印刷ダイアログが表示されず、戻り値に 0 が返ってきます。

    一部のプリンタというのは、今のところ複合機を指定した場合にそうなります。

    以下ソースコードを添付させて頂きます。

    DEVMODE構造体を設定しないと、印刷ダイアログが正しく表示されますが関係ありますでしょうか?
    用紙サイズや印刷の向き、給紙方法を指定したいので、DEVMODEは設定したいのですが、どう対処すればいいのかわかりません。

    よろしくお願いします。
        Dim PrintDlg        As PRINTDLG_TYPE
        Dim DevMode         As DEVMODE_TYPE
        Dim DevName         As DEVNAMES_TYPE
        Dim lpDevMode       As Long
        Dim lpDevName       As Long
        Dim bReturn         As Integer
        
        ' プリンタダイアログの設定
        PrintDlg.lStructSize = Len(PrintDlg)
        PrintDlg.hwndOwner = Me.hWnd
        PrintDlg.flags = PD_RETURNDC Or PD_PRINTSETUP Or PD_ENABLEPRINTHOOK Or PD_NOPAGENUMS Or PD_NOSELECTION
    
        ' 用紙サイズと向き、給紙方法を設定
        DevMode.dmSize = Len(DevMode)
        DevMode.dmPaperSize = Printer.PaperSize
        DevMode.dmOrientation = Printer.Orientation
        DevMode.dmDefaultSource = Printer.PaperBin
    
        ' 印刷ダイアログのDEVMODE構造体を設定 <--以下のブロックをコメントアウトすると正しく動作します
        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
    
        ' 印刷ダイアログのDEVNAME構造体を設定
        With DevName
            .wDriverOffset = 8
            .wDeviceOffset = .wDriverOffset + 1 + Len(Printer.DriverName)
            .wOutputOffset = .wDeviceOffset + 1 + Len(Printer.DeviceName)
            .wDefault = 0
            .extra = Printer.DriverName & Chr(0) & Printer.DeviceName & Chr(0) & Printer.Port & 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
        
        ' 印刷ダイアログ呼出
        Call PrintDialog(PrintDlg)  <--印刷ダイアログが表示されず戻り値に0が返ってきます
    

    • 編集済み W650 2011年9月16日 8:20
    2011年9月16日 8:12