<<動作環境>>
VC++ Win7
<<問題となる内容>>
A.exeからB.dllとC.dllが呼び出される
B.dllで印刷処理を行った後、C.dllを立ち上げると
Windowsのデフォルトのプリンタでなくなってしまいました。
<<聞きたいこと>>
GetPrinterDeviceDefaultsを取得すると、Windowsのデフォルトのプリンタ名が
取得できるみたいなのですが、1度印刷を行うと、印刷を行ったプリンタ名に
変更されるようです。
共通関数の中で、GetPrinterDeviceDefaultsを使用しているので、
どうしてもGetPrinterDeviceDefaultsでデフォルトプリンタを取得しなければ
なりません。
GetPrinterDeviceDefaultsに設定されているデフォルトのプリンタ名を
変更する方法って、ありますか?
>1度印刷を行うと、印刷を行ったプリンタ名に変更されるようです。
多分実行しているアプリ上で変更されるだけで、終了すると元に戻ると思いますが
違いますか?
>GetPrinterDeviceDefaultsに設定されているデフォルトのプリンタ名を
>変更する方法って、ありますか?
SetPrinter()を調べてみたらどうでしょうか?
VC++のバージョンとプロジェクトの種類は書きましょう。
その方が話が進めやすくなります。
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
を見て思いましたがあまり裏を取っていません。
> どうしてもGetPrinterDeviceDefaultsでデフォルトプリンタを取得しなければ
> なりません。
もともと、そういう仕様の関数ではないので、その要求自体がおかしい、と言わざるを
得ません。
そもそも、その共通関数からして「常に Windows のデフォルトプリンタを取得すること
を意図していたのだけれど実装を間違えてしまった」ものなのでしょうか。
であれば、共通関数を直すべきなのでは。
そうしなければ、共通関数を使う全ての場所でアドホックな対処が必要になってしまい
ます。
そうでなく、共通関数が正しく「前回設定したものがある場合はそれを取得」という意
図で実装されていた場合、強制的に Windows のデフォルトプリンタを使うようにする
と、何か不具合が起きないとも限りません。
そのあたりは十分に検証されているのでしょうか。
で、そういうケースだとしたら対症療法的なコメントはあまりしたくないのですが…
UpdatePrinterSelection(TRUE) してみるといいかもしれません。
書かれているGetPrinterDeviceDefaultsが、
CWinApp::GetPrinterDeviceDefaultsだとして(多分そうだと思いますが)
tarouさんやaetosさんが書かれているように
MSDNを読めば、そういう仕様の関数ではない事は確認できるはずですね。
まずは、そこがスタートだと思います。
aetosさんも書かれていますが、使う関数を間違えていると言うのが多分正解で、
それなら意図にあった関数があるかどうかから探すのがスジかなと。
で、VC++のバージョンとプロジェクトの種類を書いてくれと
書いたのは、CWinApp::GetPrinterDeviceDefaultsである事の確証が
欲しかったからです。MFCを使ったプロジェクトならまず間違いないかなと。
そういう意味では、関数名は正確に書きましょうというのが本当でしょうけれど。
みなさん、ありがとうございます。
共通関数が悪いという事におさまりました。
EnumPrintersが使用できるなと思ったのですが、
いろいろなところで使用しているので今回は断念しました。