デフォルト プリンタの設定の取得について – プログラミング – Home

デフォルト プリンタの設定の取得につい...
 
通知
すべてクリア

[解決済] デフォルト プリンタの設定の取得について


ねこ
 ねこ
(@ねこ)
ゲスト
結合: 22年前
投稿: 94
Topic starter  

<<動作環境>>
VC++ Win7

<<問題となる内容>>
A.exeからB.dllとC.dllが呼び出される
B.dllで印刷処理を行った後、C.dllを立ち上げると
Windowsのデフォルトのプリンタでなくなってしまいました。

<<聞きたいこと>>
GetPrinterDeviceDefaultsを取得すると、Windowsのデフォルトのプリンタ名が
取得できるみたいなのですが、1度印刷を行うと、印刷を行ったプリンタ名に
変更されるようです。
共通関数の中で、GetPrinterDeviceDefaultsを使用しているので、
どうしてもGetPrinterDeviceDefaultsでデフォルトプリンタを取得しなければ
なりません。

GetPrinterDeviceDefaultsに設定されているデフォルトのプリンタ名を
変更する方法って、ありますか?


引用未解決
トピックタグ
ITO
 ITO
(@ITO)
ゲスト
結合: 22年前
投稿: 1235
 

>1度印刷を行うと、印刷を行ったプリンタ名に変更されるようです。
多分実行しているアプリ上で変更されるだけで、終了すると元に戻ると思いますが
違いますか?

>GetPrinterDeviceDefaultsに設定されているデフォルトのプリンタ名を
>変更する方法って、ありますか?
SetPrinter()を調べてみたらどうでしょうか?


返信引用
PATIO
(@patio)
Famed Member
結合: 3年前
投稿: 2660
 

VC++のバージョンとプロジェクトの種類は書きましょう。

その方が話が進めやすくなります。


返信引用
tarou
 tarou
(@tarou)
ゲスト
結合: 21年前
投稿: 8
 

http://support.microsoft.com/kb/133025/ja

これですかねえ
GetPrinterDeviceDefaultsはOSのデフォルトのプリンタではなく
プロセスが最後に使ったプリンタ?の情報を取得する とでも言うべきもののようで
最初のデフォルト値はOSのデフォルトプリンタになりますが
どこかでPrintDlgなり呼び出してしまうと変わってしまいます。たぶん。

A.exeが保持している最後に使ったプリンタ?をB.dllが変えてしまい
C.dllがGetPrinterDeviceDefaultsしても期待したプリンタにならないのでしょう。


http://msdn.microsoft.com/ja-jp/library/t5799e1d(v=vs.80).aspx
を見て思いましたがあまり裏を取っていません。


返信引用
aetos
(@aetos)
Noble Member
結合: 5年前
投稿: 1480
 

> どうしてもGetPrinterDeviceDefaultsでデフォルトプリンタを取得しなければ
> なりません。

もともと、そういう仕様の関数ではないので、その要求自体がおかしい、と言わざるを
得ません。
そもそも、その共通関数からして「常に Windows のデフォルトプリンタを取得すること
を意図していたのだけれど実装を間違えてしまった」ものなのでしょうか。
であれば、共通関数を直すべきなのでは。
そうしなければ、共通関数を使う全ての場所でアドホックな対処が必要になってしまい
ます。

そうでなく、共通関数が正しく「前回設定したものがある場合はそれを取得」という意
図で実装されていた場合、強制的に Windows のデフォルトプリンタを使うようにする
と、何か不具合が起きないとも限りません。
そのあたりは十分に検証されているのでしょうか。

で、そういうケースだとしたら対症療法的なコメントはあまりしたくないのですが…

UpdatePrinterSelection(TRUE) してみるといいかもしれません。


返信引用
PATIO
(@patio)
Famed Member
結合: 3年前
投稿: 2660
 

書かれているGetPrinterDeviceDefaultsが、
CWinApp::GetPrinterDeviceDefaultsだとして(多分そうだと思いますが)

tarouさんやaetosさんが書かれているように
MSDNを読めば、そういう仕様の関数ではない事は確認できるはずですね。
まずは、そこがスタートだと思います。

aetosさんも書かれていますが、使う関数を間違えていると言うのが多分正解で、
それなら意図にあった関数があるかどうかから探すのがスジかなと。

で、VC++のバージョンとプロジェクトの種類を書いてくれと
書いたのは、CWinApp::GetPrinterDeviceDefaultsである事の確証が
欲しかったからです。MFCを使ったプロジェクトならまず間違いないかなと。
そういう意味では、関数名は正確に書きましょうというのが本当でしょうけれど。


返信引用
ITO
 ITO
(@ITO)
ゲスト
結合: 22年前
投稿: 1235
 

おそらくこれでしょう
  http://homepage2.nifty.com/c_lang/sdk/sdk_79.htm
SDKだけど参考にどうぞ


返信引用
ねこ
 ねこ
(@ねこ)
ゲスト
結合: 22年前
投稿: 94
Topic starter  

みなさん、ありがとうございます。

共通関数が悪いという事におさまりました。
EnumPrintersが使用できるなと思ったのですが、
いろいろなところで使用しているので今回は断念しました。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました