tagCANDY CGI VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板
VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板
[ツリー表示へ]  [ワード検索]  [Home]

タイトル Re: CreateDCの引数について
投稿日: 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& とせねばなりません。

- 関連一覧ツリー をクリックするとツリー全体を一括表示します)

古いスレッドにレスはつけられません。