none
インストーラが、「通常使うプリンターに設定」を認識しない。 RRS feed

  • 質問

  • 初めまして。

    InstallShieldの32bit版で作成したインストーラについて、
    Windows7の32bit版、Windows7の64bit版、Windows8.1 Pro 32bit版
    の3つのOSではインストールできていました。

    ですが、Windows8.1 Pro 64bit版のOSでは、
    「通常使うプリンターが設定されていません」
    というエラーの文言が表示され、インストールがエラー終了になりました。

    32bit版OSでインストールできたアプリは、
    64bit版OSでもインストールでき、
    wow64によって動作するはずであると思っていましたが、
    何が原因でインストールに失敗するのでしょうか?

    ご教授いただけましたら、幸いです。

    2014年4月11日 8:02

回答

  • インストーラの実行時に エラーが出てインストールそのものが失敗するのでしょうか?

    InstallShield のバージョンおよびエディション、それと作成したインストーラの形式はなんでしょうか?

    InstallShield で作成したインストーラだからと言って、自動でプリンタのインストールを判断するということはないと思います。

    ですので、何らかの形で判定処理を入れているはずです。その部分で非互換な段取りがあるのかもしれません。

    基本的に、8.1 だからといってプリンタの判定が変わるということはないと思います。少なくともアプリケーションレベルでは同等です。

    ですので、プリンタが本当にインストールされていないなどがなければ、上記のような状況にはならないのではないか?と考えます。


    とっちゃん@わんくま同盟, Microsoft MVP for Visual C++ (Oct 2005-) http://blogs.wankuma.com/tocchann/

    • 回答の候補に設定 星 睦美 2014年4月14日 0:15
    • 回答としてマーク 星 睦美 2014年4月21日 4:48
    2014年4月11日 12:32

すべての返信

  • インストーラの実行時に エラーが出てインストールそのものが失敗するのでしょうか?

    InstallShield のバージョンおよびエディション、それと作成したインストーラの形式はなんでしょうか?

    InstallShield で作成したインストーラだからと言って、自動でプリンタのインストールを判断するということはないと思います。

    ですので、何らかの形で判定処理を入れているはずです。その部分で非互換な段取りがあるのかもしれません。

    基本的に、8.1 だからといってプリンタの判定が変わるということはないと思います。少なくともアプリケーションレベルでは同等です。

    ですので、プリンタが本当にインストールされていないなどがなければ、上記のような状況にはならないのではないか?と考えます。


    とっちゃん@わんくま同盟, Microsoft MVP for Visual C++ (Oct 2005-) http://blogs.wankuma.com/tocchann/

    • 回答の候補に設定 星 睦美 2014年4月14日 0:15
    • 回答としてマーク 星 睦美 2014年4月21日 4:48
    2014年4月11日 12:32
  • InstallShieldのバージョンは5.5です。
    エディションはproだと思います。
    形式?はiprとなっています。

    調査したところ、
    InstallShield内のVCのアプリでエラー終了していました。
    エラーになるOSは、現状ではWindows8.1 64bit OSのみです。

    下記3つでは、インストーラは成功します。
     Windows7   32bit OS
     Windows7   64bit OS
     Windows8.1 32bit OS

    どうやら、
    VC6.0のCPrintDialogの
    GetDefaults()で、通常使うプリンターを認識していなかったようです。

    対処法について、ご教授頂ければ幸いです。

    2014年4月25日 1:24
  • VC6ですか。。。ちょっと古すぎて何とも言えませんね。

    対処法は、地味ですが「自力でデバッグする」しかないと思います。

    残念ながら、VC6はすでに終わった製品です(サポートはもちろん、Javaがらみの訴訟の関連で入手そのものが不可能な製品のため)。

    そのため、現在保有していない人は、新たに入手することができません。また、WindowsSDK自身も開発環境としては古すぎてサポートしていないため、新しいバージョンの何かを持ってくればということもできません。

    ということで、一般的ですがチェック項目を。

    1.プリンタの違いをチェック

    OSが違っているのが理由ではなくプリンタが違っているために発生しているエラーかを検証します。

    プリンタが違っていて発生しているのなら、同じプリンタを選べばほかのOSでもエラーが発生するかもしれ前ン。

    2.プログラムコードからたどる

    GetDefaults()がプリンタを認識していないということがわかっているので、なぜ認識しないかを調査します。

    エラーコードが取れるならエラーコードから調査します。ハングアップしてしまうのならどこでハングアップしているかを調査します。

    と、さしあたりごくごく一般的ですが、トラブルシュートの最初の1歩を書いておきます。


    とっちゃん@わんくま同盟, Microsoft MVP for Visual C++ (Oct 2005-) http://blogs.wankuma.com/tocchann/

    • 回答としてマーク TANAKA Hiroshi 2014年6月9日 6:22
    • 回答としてマークされていない TANAKA Hiroshi 2014年6月9日 6:22
    2014年4月25日 2:39
  • ご回答ありがとうございます。
    この件は結局自力で解決したのですが、
    結果的には、インストーラは関係ありませんでした。

    問題は、Windows8の64bitでは、
    CPrintDialogが認識されなかったということでしたので、
    認識するように対処して解決させて頂きました。

    これは、Microsoft様のバグだと思うので、
    今後のためにもWindows8の64bitでCPrintDialogが認識されるように、
    修正をお願いしたいです。

    現状では、CPrintDialogより原始的な、
    GetProcAddressを使うコードに書き換える時間が無駄すぎます。

    2014年6月17日 4:52
  • Visual C++ 6.0 をお使いでしたよね?

    CPrintDialog::GetDefaults() が認識されないということですが、その修正をサポートの終了した(しかも、裁判所の判決により配布もできない)製品に求めても、対応されることはありません。

    サポートを期待するのであれば、サポート期間中の製品を利用することをお勧めします。

    古い製品を使い続けるのであれば、不具合を含め、問題が発生しても今回のように自己解決する以外の選択肢はないと思います。


    とっちゃん@わんくま同盟, Microsoft MVP for Visual C++ (Oct 2005-) http://blogs.wankuma.com/tocchann/

    2014年6月17日 5:36
  • これは、Microsoft様のバグだと思うので、
    今後のためにもWindows8の64bitでCPrintDialogが認識されるように、
    修正をお願いしたいです。

    サポートが終了している件はとっちゃんさんの指摘に同意見です。

    ちなみにサポートの終了は 2005/09/30 です。
    すでに 8 年以上経過しているのにその開発環境を利用し続けていることが問題と考えるべきです。

    たとえば、サポート終了後はランタイムにセキュリティの脆弱性が見つかったとしても修正されていません。
    それに依存したアプリを開発、提供していると言うことを自覚しましょう。

    また、フォーラムは Microsoft が提供していますが、Microsoft の回答義務はありませんし、サポート窓口でもありません。
    今回のケースに限らず、Microsoft にお願いしたいことを書く場所ではないと言うことをご理解ください。

    現状では、CPrintDialogより原始的な、
    GetProcAddressを使うコードに書き換える時間が無駄すぎます。

    有益な投資を考えたいのであれば、ぜひ最新の開発環境に、最低限サポートが提供されている開発環境に移行しましょう。
    それによる移植コストは確かにありますが、昨今のセキュリティ事情を考えれば、顧客に安心を提供できると考えて積極的な投資も必要です。
    (その他、開発効率の改善に効く可能性はあります)

    2014年6月17日 13:18
    モデレータ
  • 他の方も指摘していますが、私も自分なりの表現をしておきたいので。

    これは、Microsoft様のバグだと思うので、今後のためにもWindows8の64bitでCPrintDialogが認識されるように、修正をお願いしたいです。

    現状では、CPrintDialogより原始的な、GetProcAddressを使うコードに書き換える時間が無駄すぎます。

    質問者さんに都合の悪いものが何でもかんでもMicrosoftのバグになるわけではありません。

    実際、Visual C++ 6.0の発売はWindows 2000よりも前となる1998年です。当然ですがWindowsには年々機能追加されていて、それにはプリンター周りのAPIの強化も含まれます。現在のGetDefaultPrinterのドキュメントにはもはや跡形もなく説明が消されてしまっていますが、古いドキュメントには

    Windows NT/2000:Windows 2000
    Windows 95/98:対応していません

    とVC++6.0発売当時のNT4やWin98にはこのAPIが存在しなかったことを示しています。

    それらに目をつぶりったとして「修正をお願いしたいです」はどういう意味でしょうか? すでに指摘されているようにサポートの終了したVC++6.0の修正を要求したいという考えでしょうか、それともWindows側に過去と同じ動作をする(=一切の機能追加を行わない)を要求したいという感がでしょうか?
    もし、質問者さんがVC++6.0を安定して使い続けたいのであれば、OSについても同様にWindows 98を使い続けるべきです。少なくとも修正を要求することがナンセンスなことは自覚すべきです。

    2014年6月17日 21:19
  • 皆様
    ご回答ありがとうございました。

    確かにその通りですね。
    VC6を使うこと自体ナンセンスでした。


    ちなみに蛇足ですが、今回の備忘録として、
    解決する際に参考になったページを下記に書いておきます。

    ◆参考文献:
    Windows の通常使うプリンタを取得および設定する方法.mht
    http://support.microsoft.com/kb/246772/ja

    2014年6月18日 4:29