- このトピックは空です。
-
投稿者投稿
-
2021年6月29日 6:03 PM #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 Longf_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点、よろしくお願いいたします。
2021年6月29日 6:03 PM #870Hirayama
ゲストいつもお世話になっております。
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.関数の使用方法につきましてはよろしいかと思います。以上宜しくお願い致します。
2021年6月29日 6:04 PM #871TaNaKa
ゲストお世話になります。
以前の投稿に誤りがあったので訂正します。
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
ここからダウンロードしたサンプルを参考にしました。以上よろしくお願いいたします。
2021年6月29日 6:04 PM #872Hirayama
ゲストご質問の内容に関しまして、下記コードを参考にしてみて下さい。
途中省略
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以下省略
以上宜しくお願い致します。
2021年6月29日 6:04 PM #873TaNaKa
ゲストお世話になります。
おかげさまで用紙の設定をして、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になって出力されてしまうのです。既にご存知かも知れませんが、何かの参考になれば幸いです。
※ここに書いた情報は体験版で検証しましたので、製品版で既に対応済み
※であれば申し訳ありません。 -
投稿者投稿
- フォーラム「旧サポート掲示板」には新規投稿および返信を追加できません。