none
ATLでDLL削除後の登録解除方法は? RRS feed

  • 質問

  • 皆さんこんにちは。
    私は今ATLの勉強をしています。

    私の場合、ATLの勉強時に適当にProgID名をつけて数多く作成します。
    すると、ビルドするコントロール毎ににActiveXコントロールに数多く登録されます。

    こうなると、似たような名前で煩雑に登録されているはずなので、不要となった
    登録を削除したくなるが流れだと思います。

    もし、プロジェクトフォルダが残っていたら、
    1.ツールー>ActiveXテストコンテナを起動
    2.ファイルー>コントロールの登録ー>登録解除
    で登録解除できる(結構めんどくさい)のですが

    プロジェクトフォルダを完全消去してしまっていたら上記方法では、
    登録解除できません。『~レジストリーを削除しますか?』と出て「はい」
    をクリックしても永遠に残り続けます。

    regedt32で手動で消すにしても消す場所が分かりません。

    誰か、もっとActiveX登録解除方法の簡単な方法、または
    手動で登録解除方法をご存知ないですか?


     

    2006年4月24日 1:19

すべての返信

  • レジストリエディタで消せます。

    HKEY_CLASSES_ROOTや、

    HKEY_CLASSES_ROOT\CLSIDに入りますので、そこで削除対象のクラスを検索したりして消すツールを作るか探すといいのではないでしょうか。(^^

    2006年4月24日 2:09
  • とっちゃんです。

    削除は地道にレジストリエディタで削除しかありませんね。

    もしかしたら、ツールとかあるかもしれませんが(仕組み的にはツールで作ることは可能)、調べたことがないので存在はわかりません。

    ATL(正確にはComponent Object Model を採用したもの)の登録情報の削除手順としては

    1. HKEY_CLASSES_ROOT(以下)HKCR 直下から ProgIdを探す(2個あります)
    2. CLSID を取り込み HKCR\CLSID キー内から捜す
    3. 該当のキーに TypeLib があるので今度は HKCR\TypeLib からキーを捜す
    4. HKCR\AppId にも情報がある場合があるのでそれを消す(VSのバージョン依存)
    5. HKCR\Interface にもやはりあるのでそこからも削除する

    というのが本当の手順です。

    Inteface 部分はソースが残ってないと探しきれない(TypeLibにしか情報がないため)と思いますので、無視してしまってもいいでしょう。

    ま、ごみとして残ったままでも、動作や開発に支障があるわけではありませんのでそれほど気にする必要はないかと。

    2006年4月24日 4:29
  • たぶんTest1.Class1とかっていうインターフェイスがごろごろいてるんじゃないかと思います。

    それを一覧から消すだけなら1のProgIdを消して回るだけですむように思います。

    ですよね?(^^

    2006年4月24日 8:23
  • >ですよね?(^^

    ブー。はずれです(^^;

    一覧情報として出てくる(コントロールのテストやOLEの貼り付けメニューなどなど)場合の検索先は、ProgId じゃなくて、CLSID のほうです。

    なので、CLSID を消さないと一覧からは消えないんですよ。

    CLSID\{...} のサブキーに

    Control があれば、それは ActiveX コントロールとして

    Insertable があれば、OLEサーバーとして

    Programable があればオートメーションとして

    リストされるようになっています。

    #他にもいろいろと意味のあるキーはありますが(^^;

    なので、不要なCLSIDを消し去りたいのなら、ツールを作るのが一番の早道かと(^^;

    #古いインストーラだと、登録情報を消さないのもあるし...(インストーラ作者のチョンボ)。

    ま、実害は殆どないので、気にしないというのも選択肢の一つではありますが(^^;

    どのみち、開発環境は1~2年に一度くらいリフレッシュしてあげないと...ね(^^;

    昔は新OSや、新VSというタイミングが定期的にあったんですがね。

    今は、同居できちゃうので、なかなか新規構築までは行かないですからねぇ(^^;

    2006年4月24日 10:12
  • こんにちは、スレ主のshigeです。

    中博俊様
    とっちゃん様
    回答ありがとうこざいます。おかげさまで、やりたい事は出来ました。

    DLLが無い場合の登録解除ツールは結構探しましたが見つける事が出来ませんでした。ただし、レジストリクリーナーと言うツールを使えば出来るかも・・・(未検証)。

    レジストリエディタでの手動削除も実際にやってみて削除できました。

     >Inteface 部分はソースが残ってないと探しきれない(TypeLibにしか情報がないため)と思いますので、無視してしまってもいいでしょう。

    ActiveXテストコンテナ起動で登録解除でも、Interfacesにゴミが残っていました(OLE/COMオブジェクトビューアで確認)

    どのみち、開発環境は1~2年に一度くらいリフレッシュしてあげないと...ね(^^;

    最近は仮想PC環境が手軽に構築できるので、開発環境を直PCに構築は行なわない様になりました。机の上のホコリ(ゴミ)は気にしないのに、レジストリのホコリは結構気になる今日この頃でした。

    それでは。

    2006年4月25日 1:26
  • とっちゃんです。

     shige さんからの引用

    ActiveXテストコンテナ起動で登録解除でも、Interfacesにゴミが残っていました(OLE/COMオブジェクトビューアで確認)

    テストコンテナの登録処理は、自己登録任せです。

    なので、ごみが残るとしたら、登録解除ルーチンの内部の段取りがミスっているのではと思います。

    ATL(MFCにも同様のものがある)の登録関数で、登録時に TypeLib を登録するようになっているのなら、登録解除では解除するように指定してください。

    今はどうなってるかわかりませんが、確か昔のATLかMFCには登録はTypeLibを登録するのに、解除では放置という初期値の設定ミスがあったように思います。

    机の上のホコリ(ゴミ)は気にしないのに、レジストリのホコリは結構気になる今日この頃でした

    インストーラ作るようになるともっと気になります。でもある程度の線で割り切りは必要です(^^;

    2006年4月25日 1:53
  • 半端なレジストリクリーナならローカルCOM利用を想定したCOM登録が、コンポーネントが見つからないと消してしまう可能性もありそうですね。

    きっちり作るとなかなか面白いツールになりそうです。(^^

    2006年4月25日 2:06
  •  中博俊 さんからの引用

    半端なレジストリクリーナならローカルCOM利用を想定したCOM登録が、コンポーネントが見つからないと消してしまう可能性もありそうですね。

    きっちり作るとなかなか面白いツールになりそうです。(^^

    開発中は面白そうですね(端から見てる分には)。

    テスト用に逝かしてもいいメイン&開発マシンを何台か用意しないとダメそうですが。
    #いろんなパターンを考えると10台くらいはユニークな環境がほしいですねぇ

    少なくとも自分の開発マシンでは...まだ引越しの予定はないからテストには使えないなぁw

    2006年4月25日 4:44