[WR2.0]wrSet/wrGetReportPrinterを使うには

HOME › フォーラム › 旧サポート掲示板 › [WR2.0]wrSet/wrGetReportPrinterを使うには

  • このトピックは空です。
5件の投稿を表示中 - 1 - 5件目 (全5件中)
  • 投稿者
    投稿
  • #869
    TaNaKa
    ゲスト

    現在WingReport Ver2.0Jの体験版とVB6.0で開発を行っています。
    製品版をいずれ購入しますが、製品版が届くまで体験版で開発を行っています。

    一つのレポートをFAXとプリンタの両方に出すために、
    wrSet/wrGetReportPrinter関数を使おうと思っています。
    ちなみにwrSetPrinterDevice関数を使わないのは、FAXソフトがSTARFAX2000だと用紙の設定値が違うのか、A4に戻ってしまうためです。(設定値は自分で調べました。)

    wrInit、wrLoadReport、wrOpenPrinterの順で関数を呼び、以下の関数を実行します。

    Public Function f_WingGetDevMode(p_hReport As Long, p_DevMode As DEVMODE) As Boolean
    ‘WingReportに設定されているDevModeの取得
    ‘p_hReport レポートのハンドル
    ‘p_DevMode 取得したDEVMODEを返す

    Dim Result As Long
    Dim Needed As Long
    Dim pFullDevMode As Long
    Dim pDevMode() As Long

    f_WingGetDevMode = False

    ‘プリンタ情報のサイズを取得
    If wrGetReportPrinter(p_hReport, vbNullString, Needed, WAP_GPINFOSIZE) = 0 Then
    Exit Function
    End If

    ‘領域の確保
    ReDim pDevMode(Needed) ‘とりあえず多めに

    ‘詳細な情報を取得
    If wrGetReportPrinter(p_hReport, vbNullString, pDevMode(0), WAP_GPDEVICEINFO) = 0 Then
    Exit Function
    End If

    ‘ポインタから取得
    pFullDevMode = pDevMode(7) ‘7でいいのか?

    Call CopyMemory(p_DevMode, ByVal pFullDevMode, Len(p_DevMode))

    f_WingGetDevMode = True

    End Function

    ところが一回目のwrGetReportPrinter関数でエラー(戻り値0)
    になってしまいます。
    wrGetErrorCode関数の戻り値は8006でした。
    そこでここのHPのサポートページを見ましたら、

    ——————————————————-
    wrSet/wrGetReportPrinterにおいて第2パラメータDeviceName
    を指定するように変更されました。
    通常デバイス名が31Byte以下であれば今まで通りNULL(0)を
    指定してください。
    詳細については当社までお問い合わせください。
    ——————————————————-

    と書かれていましたので、前置きが長くなりましたが質問させていただきます。

    1.第2パラメータには何を指定すればいいのですか?
    2.通常デバイス名とはなんですか?
    3.ヘルプにVBのサンプルが載っていなかったので上記の関数を
      自作したのですが、このようなやりかたで正しいのですか?

    以上3点、よろしくお願いいたします。

    #870
    Hirayama
    ゲスト

    いつもお世話になっております。

    WingReportの定義ファイルにおいてwrGetReportPrinter/wrSetReportPrinter関数の
    Declare文を以下の用に修正し再度お試しいただけますでしょうか?

    Declare Function wrGetReportPrinter Lib “WRENGN32.DLL” (ByVal hReport As Long, ByVal lpDeviceName As String, ByRef lpDevMode As Any, ByVal wOperation As Long) As Long

    Declare Function wrSetReportPrinter Lib “WRENGN32.DLL” (ByVal hReport As Long, ByVal lpDeviceName As String, ByRef lpDevMode As Any) As Long

    Q1.第2パラメータには何を指定すればいいのですか?
    A1.バッファを指定するとプリンターのデバイス名が格納されま
       す。必要のない場合にはNULLを指定して下さい。

    Q2.通常デバイス名とはなんですか?
    A2.プリンター名です。

    Q3.ヘルプにVBのサンプルが載っていなかったので上記の関数を
       自作したのですが、このようなやりかたで正しいのですか?
    A3.関数の使用方法につきましてはよろしいかと思います。

    以上宜しくお願い致します。

    #871
    TaNaKa
    ゲスト

    お世話になります。

    以前の投稿に誤りがあったので訂正します。

    1.wrInit、wrLoadReport、wrOpenPrinterの順で
          ↓
      wrOpenPrinterの前にやらないとだめみたいです

    2.ReDim pDevMode(Needed)
          ↓
      ReDim pDevMode(Needed \ 4)で十分みたいです

    おかげさまで一回目、二回目ともwrGetReportPrinter関数
    は成功するようになりました。
    ですが、ポインタから構造体に取り込むためCopyMemory関数
    を実行するとアプリケーションエラー
    (WinNT Server 4.0 SP5なのでワトソン博士が出てきます)
    になります。

    これを回避するにはどうしたらいいでしょうか?
    DEVMODE構造体の宣言は現在ダウンロードできるモジュールと
    同じでした。

    実は、C言語は未経験ですのでポインタとかはよく
    分かっていないのです。
    http://support.microsoft.com/support/kb/articles/Q198/9/01.ASP
    ここからダウンロードしたサンプルを参考にしました。

    以上よろしくお願いいたします。

    #872
    Hirayama
    ゲスト

    ご質問の内容に関しまして、下記コードを参考にしてみて下さい。

     途中省略

    Dim pDevMode() As Byte
    Dim Needed As Long
    Dim Template As DEVMODE

    ‘プリンタ情報のサイズを取得
    If wrGetReportPrinter(hReport, vbNullString, Needed, WAP_GPINFOSIZE) = 0 Then
    Exit Function
    End If

    ‘領域の確保
    ReDim pDevMode(Needed) As Byte

    ‘詳細な情報を取得
    If wrGetReportPrinter(hReport, vbNullString, pDevMode(0), WAP_GPDEVICEINFO) = 0 Then
    Exit Function
    End If

    ‘内容が見易いようにDEVMODE構造体の変数にメモリー内容をコピー
    Call CopyMemory(Template, pDevMode(0), Len(Template))

    ‘ここでプリンタ情報を設定
    ‘但し、拡張領域の内容を変更する場合にはバイト配列の内容を直接編集します。

    ‘設定した内容を再び元の領域に戻す
    Call CopyMemory(pDevMode(0), Template, Len(Template))

    ‘プリンタ情報をセット
    If wrSetReportPrinter(hReport, vbNullString, pDevMode(0)) = 0 Then
    Exit Function
    End If

     以下省略

    以上宜しくお願い致します。

    #873
    TaNaKa
    ゲスト

    お世話になります。

    おかげさまで用紙の設定をして、FAXに送信することができました。
    ありがとうございました。
    また他の方のために、このサンプルコードをヘルプに載せて頂ければ
    ありがたいです。

    ちなみに最初の投稿で、FAXソフトだと用紙の設定値が違うと書いたのは、
    DEVMODE構造体のdmPaperSizeメンバにセットする値がMSDNに書かれて
    いる設定値と異なる、ということです。
    http://www.microsoft.com/JAPAN/developer/library/vcmfc/_mfc_devmode_structure.htm

    例えば用紙をB4に設定したいときは普通のプリンタの場合 DMPAPER_B4(12)
    をセットしてやればいいのですが、STARFAX2000だと128
    (これを自分で調べました。またOS(ドライバ?)によっても異なる)
    をセットしないといけませんでした。

    これが原因か分かりませんが、普通のプリンタでB4に設定してある
    レポートをwrSetPrinterDevice関数を使ってプリンタだけ
    FAXに変えても、用紙がA4になって出力されてしまうのです。

    既にご存知かも知れませんが、何かの参考になれば幸いです。

    ※ここに書いた情報は体験版で検証しましたので、製品版で既に対応済み
    ※であれば申し訳ありません。

5件の投稿を表示中 - 1 - 5件目 (全5件中)
  • フォーラム「旧サポート掲示板」には新規投稿および返信を追加できません。