tagCANDY CGI VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板 [ツリー表示へ]   [Home]
一括表示(VB6.0)
タイトルCreateDCの引数について
記事No12924
投稿日: 2008/08/20(Wed) 00:54
投稿者蒼月
いつも、お世話になっています。

私は今、プリンタでの印刷を行っています。

gdiを使って印刷をしようとしているのですが、CreateDC関数がうまくいきません。

windowsのプリンタとFAXの部分に表示されている、名前を使ってCreateDCをすればいいと思っているのですが、何か勘違いしていますでしょうか?

例えば、表示名が「AAAA」だったのなら、

Declare Function CreateDC Lib "gdi32.dll" Alias "CreateDCA" _
    (ByVal lpszDrive As String, ByVal lpszDevice As String, _
    ByVal lpszOutput As Long, lpInitData As Any) As Long

CreateDC("AAAA", vbNullString, 0, 0)

とすればできるものと思っていたのですが、できませんでした。

引数を

CreateDC(vbNullString,"AAAA", 0, 0)

とするなど、色々試行錯誤はしてみたのですが、うまくいきません。
使用方法など間違っていますか?

勘違いなどありましたら、指摘をお願いします。

[ツリー表示へ]
タイトルRe: CreateDCの引数について
記事No12925
投稿日: 2008/08/20(Wed) 06:59
投稿者花ちゃん
> gdiを使って印刷をしようとしているのですが、CreateDC関数がうまくいきません。

この場合、関数名が分かっているので、関数名をキーに検索して、シラミつぶしに
探せば見つかるはずです。

という事で探して見ました。下記は参考になりませんか?
 http://support.microsoft.com/kb/180645/ja

hPrintDc = CreateDC(Printer.DriverName, Printer.DeviceName, 0, 0)

デバイスコンテキストが不要になったら、 Ret = DeleteDC(hPrintDc)  で削除して
おいて下さい。

[ツリー表示へ]
タイトルRe^2: CreateDCの引数について
記事No12931
投稿日: 2008/08/20(Wed) 22:50
投稿者蒼月
花ちゃんさん
回答ありがとうございます。
返信が遅くなってしまい、申し訳ありません。

ご紹介頂いた、ページを参考に解決しました。

hPrintDc = CreateDC(Printer.DriverName, Printer.DeviceName, 0, 0)

とすることで印刷することができました。

第一引数、第二引数、両方に渡さないとダメなんですね。

MSDNのCreateDCの

「lpszDevice パラメータで特定のデバイスを指定する場合、
lpszDriver パラメータで NULL を指定しなければなりません。」

という説明を私が、誤って解釈していたようです。
(今回の例で言うと、"AAAA"という特定のデバイスを指定しているので
lpszDriverはNULLでないといけないといった感じです。)

ありがとうございました。

[ツリー表示へ]
タイトルRe: CreateDCの引数について
記事No12928
投稿日: 2008/08/20(Wed) 10:50
投稿者魔界の仮面弁士
すでに花ちゃんさんの回答が付いているので、私からは
> 使用方法など間違っていますか?
の点について。


> Private Declare Function CreateDC Lib "gdi32" Alias "CreateDCA" _
>   (ByVal lpDriverName As String, ByVal lpDeviceName As String, _
>    ByVal lpOutput As Long, ByVal lpInitData As Long) As Long

CreateDC API は、以下のように定義されています。

----------------------------------------------------------------------
 HDC CreateDC(
  LPCTSTR lpszDriver,        // ドライバ名
  LPCTSTR lpszDevice,        // デバイス名
  LPCTSTR lpszOutput,        // 未使用(NULL 固定)
  CONST DEVMODE* lpInitData  // プリンタドライバデータ(任意指定)
 );
----------------------------------------------------------------------

VB の場合、最後の引数について、いろいろな指定方法がありますが、用途に応じて
 ByRef Any    … 任意データ(融通が利くが、データ型を意識せねばならない)
 ByVal Long   … アドレス指定(NULL 指定に便利だが、データ指定時には VarPtr 関数の併用が必要)
 ByRef DEVMODE  … ユーザー定義型を渡す場合(NULL 参照を渡せないという制限あり)
 ByRef Byte   … バイナリデータとして渡す場合(Byte配列の先頭要素を参照渡しする/NULL 参照は渡せない)
などがよく利用されています。

その意味では、Declare 宣言そのものに問題はありません。


> CreateDC("AAAA", vbNullString, 0, 0)
しかし、これは問題です。

(1) 第一引数の "AAAA" が意味を為しているでしょうか。第一引数には、
 プリンタ名 (もしくは、vbNullString / "WINSPOOL" / "DISPLAY" )で
 なければなりませんが、"AAAA" というプリンタが本当にあるのでしょうか?

(2) 画面への描画の場合には、第二引数に(ByVal の)vbNullString を指定する事も
 ありますが、プリンタへの出力目的であれば、第二引数も指定する必要があります。

(3) 第四引数に、0 を渡してはいけません。ByRef Any に対して 0 を指定すると、
 「NULL 参照」を指定しているのではなく、「0 という 16bit整数値への参照」に
 なってしまいます。NULL 参照を渡したいなら、ByVal 0& とせねばなりません。

[ツリー表示へ]
タイトルRe^2: CreateDCの引数について
記事No12932
投稿日: 2008/08/20(Wed) 23:06
投稿者蒼月
魔界の仮面弁士さん
ご指摘、ありがとうございます。

> > CreateDC("AAAA", vbNullString, 0, 0)
> しかし、これは問題です。
>
> (1) 第一引数の "AAAA" が意味を為しているでしょうか。第一引数には、
>  プリンタ名 (もしくは、vbNullString / "WINSPOOL" / "DISPLAY" )で
>  なければなりませんが、"AAAA" というプリンタが本当にあるのでしょうか?
今回は、プリンタ名というのがどれを指しているのかがよくわからず、
windowsのプリンタとFAXの項目に表示された名前がプリンタ名なのでは?
という予測の元それをそのまま使用しました。
(例では、"AAAA"となっていますが、実際はその表示名を入れています。)

> (2) 画面への描画の場合には、第二引数に(ByVal の)vbNullString を指定する事も
>  ありますが、プリンタへの出力目的であれば、第二引数も指定する必要があります。
第一引数と第二引数の意味の理解があいまいだったので、今回の使い方の場合は、両方の引数が、NULL以外の文字となることは無いと思い込んでしまっていました。
(逆を言えば、どちらかは必ずNULLでないといけないと思い込んでいました。)

> (3) 第四引数に、0 を渡してはいけません。ByRef Any に対して 0 を指定すると、
>  「NULL 参照」を指定しているのではなく、「0 という 16bit整数値への参照」に
>  なってしまいます。NULL 参照を渡したいなら、ByVal 0& とせねばなりません。
0を渡しているサンプルコードと、0&を渡しているサンプルコードがあり、
違いは疑問に思っていたのですが、とりあえず、まずは印刷ができるようにしたかったため、その違いについては後回しにしていました。

魔界の仮面弁士さんの助言は本当に勉強になります。
ありがとうございました。

[ツリー表示へ]