none
WindowsVista プリンタドライバの再インストール RRS feed

  • 質問

  •  プリンタドライバを開発し、そのインストーラにPrintUIEntry( )を使用した実行モジュールをVC++で作成しました。初回インストールは正常にインストールされるのですが、2回目以降正常にインストールされるように見えるのですが、実際のドライバファイル(DLL)が更新されません。

     調査したところ $(SYSTEM32)\DriverStore\FileRepository 配下にバックアップされており、2回目以降インストーラに添付されているファイルを使用せずに、このファイルがシステムに展開されているようでした。さらに調べたところ Vista SDK にこのバックアップファイルを削除すると思われる関数「DeletePrinterDriverPackage( )」を見つけました。そこで、アンインストール機能をインストーラに設けインストール前にこの関数を呼び出すようにしたのですが、どうもまだ実装されていないようで、当該関数呼び出しのところでプロセスが終了してしまいます。試しに「winspool.drv」からこの関数のアドレスを GetProcAddress( )で取得しようとしたのですが、NULLが返ってきます。

     実行環境は、Windows Vista RC2  で 11/17 に WindowsUpdate を実施し最新になっています。

     この DeletePrinterDriverPackage( ) に関する情報をお持ちの方、またこの現象を回避する方法をご存じの方、情報をいただけないでしょうか?

    よろしくお願いします。

     

    2006年11月17日 4:38

すべての返信

  • Vista 世代のドライバのインストールについては、http://www.microsoft.com/japan/whdc/driver/install/default.mspx を見てもらうのが良いかと思います。プリンタのところは空っぽでしたけど、英語サイトなら何かのってるかもしれません(未調査です)。

    結構いろいろ書かれていますので、多少なりとも参考にはなると思います。

     

    2006年11月17日 8:46
  • とっちゃん様 アドバイスありがとうございました。URLのリンクをたどるとプリンタドライバの新機能についてのワードファイルがあり、そこにこと細かく載っていました。
    http://www.microsoft.com/japan/whdc/xps/pkginstall.mspx
    それによると、VistaではDriverStoreという機能が追加されており、これはインストールメディアから直接インストールするのではなく、DriverStoreにドライバパッケージを追加しそこからドライバをインストールするそうです。DriverStoreは常に信頼されたパッケージが保存されており、ドライバインストールは今までのように管理者だけが行うのではなく一般ユーザも行えるようになるそうです。これは、コンピュータベンダー(製造者)が先にDriveStoreにプリンタドライバをインストールしておけば、購入者は管理者権限(UAC無効)になることなくプリンタドライバがインストールできるという仕組みです。管理者権限のユーザになるということは常にリスクが伴うため、それをなるべく回避するというのがVistaのポリシーのようです。また、VistaからプリンタドライバもSxSを導入するそうで、複数のバージョンを管理することが可能になるそうで、DriverStoreには複数のバージョンが格納されることになります。
    ちなみに、DriverStoreにアクセスするには管理者権限が必要なのですが、インストーラを作成する場合そのプロセスに管理者特権を付けることでUACを解除しなくても動作させることが可能です。

    DriverStoreからプリンタドライバを削除するには、特殊な方法をとります。プリンタドライバはDriverStoreに格納される際、.infファイルとその中のDriverVerを参照し、別名を付けてVistaは管理しています。そのため、この別名から元の.infファイルを見つけ出し、自分が消したいドライバかどうか判定して削除します。なお、DeletePrinterDriverPackage()はどうやっても動かなかったため(使い方が間違っていたかも)、PnPUtil.exe を使用しました。
    使用したAPIの使用は以下の通りです。
    SetupGetInfFileList … ドライバ(別名)の一覧取得
    SetupGetInfDriverStoreLocation … ドライバ名から.infのフルパスを取得→消そうとしているドライバかどうかを判定
    CreateProcessでPnPUtil.exeを実行 … 「-d」を付けて、DriverStoreからドライバパッケージを削除

    以上

    2006年11月21日 8:43