DEVMODE構造体を再定義するには?

解決


そがっち  2006-10-05 02:03:59  No: 133549

初めて失礼致します。
現在、VB6 SP6,Win2k SP4の環境にて、プログラム中の
画像をプリントアウトする部分で困っています。
現在考えている要件としては
  ・「通常使うプリンタ」以外にも出力したい
  ・「通常使うプリンタ」は変更したくない
  ・細かいプロパティをユーザに設定させる必要は無いので、ダイアログは出さずに
    プリンタの現状のプロパティを取得して、強制的に変更して出力したい
プリンタのスプールに直接イメージを吐き出すようなサンプルはMSDNのサイトで
見かけたので、出力自体は、最悪でも それで何とかなるとは思うのですが、
プリンタの設定方法がわからず、困り果てている状態です。
MSDNで検索してDocumentPropertiesというAPIは発見しました。
そこでは、やり方として
1.DEVMODE構造体のサイズを取得
2.現在のプリンタ設定をDEVMODE構造体に取り込む
3.新しい設定を引き渡して反映させる
と あったのですが(全ててDocumentPropertiesの機能)、
「構造体のサイズを取得して、その後で構造体を定義するなんてVBで出来たっけ?
  構造体はモジュールレベルでしか定義出来ないのでは?」
というレベルの問題で解決法がわからなくなり、質問した次第です。
長くなって申し訳ありませんが、何か良い解決方法は ありますでしょうか?


VBアマチュア  2006-10-05 02:28:25  No: 133550

もしも見当違いの答えだったら申し訳ありません。
通常使うプリンタを変更せずに、その他のプリンタで出力したいってことですよね??
こちらのサイトを参考にしてはどうでしょうか↓
http://www.bcap.co.jp/hanafusa/dotnet/index.html

印刷関係のプリンターの[一覧を取得及び指定のプリンターで印刷]のところを参考にしてみて下さい。


VBアマチュア  2006-10-05 02:29:57  No: 133551

あ、すみません。
印刷関係の「プリンターの一覧を取得及び指定のプリンターで印刷」のところでした。


魔界の仮面弁士  2006-10-05 02:38:46  No: 133552

> 構造体のサイズを取得して、その後で構造体を定義するなんてVBで出来たっけ?
その手の処理については、
  1. 構造体サイズを取得
  2. Byte配列などにて、そのサイズ分のメモリを確保
  3. そのメモリ領域を構造体とみなして、APIと通信
     (必要に応じて、RtlMoveMemoryなどでポインタからのデータ複写)
といった手順で処理されます。

API側にしてみれば、読み書きするためのメモリさえ用意されていれば、
それがVB側でByte配列として確保されていようと、構造体/ユーザ定義型で
確保されていようと気にしない、ということです。


そがっち  2006-10-05 03:06:21  No: 133553

早速の回答、ありがとうございます。
>VBアマチュア さん
あ、当方の環境はVB6ですので……(汗)
しかし.NETだと簡単そうですねぇ。.NET知らないけどチョットうらやましい。

>魔界の仮面弁士 さん
うわ、結構 力技な感じですね。
確かに入ってしまえば知ったこっちゃないんでしょうけど(汗)
引き続き質問になって申し訳ないのですが……
あらかじめ、DEVMODE構造体のうち変更したい部分(またはプリンタドライバに依存しない範囲)までを
普通に定義しておき(この実体をAとする)、Byte * n の配列が要素である構造体(この実体をBとする……
Redimで確保するんですよね?)にDEVMODE構造体を取り込んでから、LSetでBからAにデータを写して変更し、
今度はAからBにデータを写して何事も無かったかのようにDocumentPropertiesにて設定を行う……と処理しても
正常に動作するものなんでしょうか?
AとBのサイズが違うので、ちょっと恐い気も するんですが……


大吉末吉  2006-10-05 04:02:04  No: 133554

そがっち  さん  こんにちは。

> あらかじめ、DEVMODE構造体のうち変更したい部分
>(またはプリンタドライバに依存しない範囲)までを普通に定義しておき(この実体をAとする)、
> Byte * n の配列が要素である構造体(この実体をBとする……
> Redimで確保するんですよね?)にDEVMODE構造体を取り込んでから、
> LSetでBからAにデータを写して変更し、

確か、VB6のLSetでは、動的配列を含むユーザ定義型は、違うユーザ定義型へは設定できないのでは・・・

ですから、
> >魔界の仮面弁士 さん
> うわ、結構 力技な感じですね。

こういう、力技が必要になるんだと思います。

#最大値(例えば100バイトとか1000バイトとか)が予想できるなら、
#その値で固定配列にしておけば済むんですけどね・・・


そがっち  2006-10-05 04:14:31  No: 133555

大吉末吉 さん、レスありがとうございます。

>確か、VB6のLSetでは、動的配列を含むユーザ定義型は、違うユーザ定義型へは設定できないのでは・・・

ぐあ、そうでしたか(^^;
今までRedim使うことなんて無かったもので……
(初心者板に書いてヨカッタ……ホッ)
明日にでも、地道に頑張って組んでみることにします。
ありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加