none
Vistaにインストールし、実行するとOCX呼び出しのタイミングで、実行時エラー '339' となります RRS feed

  • 質問

  • VB6.0で実行プログラムを作成しています。
    DLLをVC6.0のMFC AppWizardで自作。
    OCXをVC6.0のMFC ActiveX ContorolWizardで自作。
     
    DLLとOCXはVS2008で再コンパイルリンク、またマージモジュールを作りました。

     

    これらのインストーラを作成し、Vistaにインストール、実行すると
    DLLの方はOKですが、OCXの方が、
     ”実行時エラー '339'  コンポーネント'abc.ocx'、またはその依存関係の1つが
        適切に登録されていません。ファイルが存在しないか、あるいは不正です。”
    となります。
    (XPではともにOKです)

     

    ocxの方は、OpenGLを利用していますが、必要なGLU32.dll, OPENGL32.dll

    は元々 Vistaの\System32\にあります。

     

    対応の仕方をご教授お願いします。

    2008年10月15日 7:01

回答

  •  クサキ さんからの引用

     ocxも実行ファイルと同じディレクトリにあれば、レジストリ登録無しでも動かないのですか?

     VS インストーラー1.1から、レジストリ登録はしない方が良いと思っていたのですが。

    ActiveX(OCX)は基本的にレジストリ登録が必要です。

    ActiveX(OCX)を探すときは、まずレジストリの登録情報を参照し、その情報からActiveX(OCX)ファイルがどこにあるかを調べます。

    レジストリに情報がない場合は、その時点でエラーになるかと思います。

     

     クサキ さんからの引用

      インストーラ作成の時、Registerが vsdrfCOMSelfReg となっていまして、
     ”インストール中に”モジュール abc.ocx で登録に失敗しました。HRESULT -2147010895。サポート担当に問い合わせてください。”

     というエラーになりまして、
     vsdrpDoNotRegister としたらインストールは出来るようになりました。その結果での質問です。

    インストールに成功したとは言い難いです。

    必要なレジストリ登録という作業を取り除いた状態になっています。

     

    -2147010895は0x800736B1、アプリケーションの構成が正しくありませんといったエラーを指し示しています。

    レジストリ登録を行おうとした時点で、Visual C++ 2008ランタイムがインストールされていない可能性があるかもしれません。

    Visual C++ 2008ランタイムを必須コンポーネントにするか、インストール順序をずらしてください。

    2008年10月16日 13:41
    モデレータ

すべての返信

  •  クサキ さんからの引用

    これらのインストーラを作成し、Vistaにインストール、実行すると
    DLLの方はOKですが、

    そのDLLの方はOKというのは、どのようなことから判断したのでしょうか?

    (DLLも実はNGという可能性)

     

     クサキ さんからの引用

    OCXの方が、

     ”実行時エラー '339'  コンポーネント'abc.ocx'、またはその依存関係の1つが
        適切に登録されていません。ファイルが存在しないか、あるいは不正です。”
    となります。

    レジストリに登録されていない、ocxから依存するファイルが見つからない等、いくつか考えられるかも。

     

     クサキ さんからの引用

    (XPではともにOKです)

    そのXPはOCXのビルドしたことのあるPCですか?または、OCXのビルドはしていないけれど、開発環境が入っていたりしますか?

    クリーンなXPにインストールして実行したのと、開発環境にインストールしたのとでは意味合いが変わってきますので、教えて下さい。

    (開発環境ではビルドでレジストリ登録されるが、クリーンな環境ではレジストリ登録されずに読み込めない可能性)

    2008年10月15日 22:39
    モデレータ
  • > そのDLLの方はOKというのは、どのようなことから判断したのでしょうか?

    > (DLLも実はNGという可能性)


    全ての関数を動かした分けではありませんが、幾つかの関数が正常に動いています。

     

     

    > レジストリに登録されていない、ocxから依存するファイルが見つからない等、いくつか考えられるかも。

     

      インストーラ作成の時、Registerが vsdrfCOMSelfReg となっていまして、
     ”インストール中に”モジュール abc.ocx で登録に失敗しました。HRESULT -2147010895。サポート担当に問い合わせてください。”

     というエラーになりまして、
     vsdrpDoNotRegister としたらインストールは出来るようになりました。その結果での質問です。

     

     ocxも実行ファイルと同じディレクトリにあれば、レジストリ登録無しでも動かないのですか?

     VS インストーラー1.1から、レジストリ登録はしない方が良いと思っていたのですが。

     

     

    > そのXPはOCXのビルドしたことのあるPCですか?または、OCXのビルドはしていないけれど、開発環境が入っていたりしますか?

    > クリーンなXPにインストールして実行したのと、開発環境にインストールしたのとでは意味合いが変わってきますので、教えて下さい。

    > (開発環境ではビルドでレジストリ登録されるが、クリーンな環境ではレジストリ登録されずに読み込めない可能性)

     

    VS2008では、まだ開発環境がありOCXのビルドをしたXPでのインストールしか行っていません。

    2008年10月16日 0:39
  • VC++2008で行なっているのであれば、Vistaに必要なランタイムが足りないのではと思います。

    VC++2005以降、ランタイムライブラリに関してはサイド・バイ・サイドという方式で管理されています。

    XPは開発環境が入っているので当然、ランタイムの登録がされていると思うので動くのではないかと。

     

    作成したインストールパッケージにこのランタイム分のインストールが含まれていないのであれば、

    サイド・バイ・サイドの管理下にランタイムがインストールされていないと言う事もあると思います。

    サイド・バイ・サイドの環境下では、対応したインストーラでランタイムをインストールするか

    マニュフェストファイル上にこのライブラリを使えと明記した上で実行環境下にランタイムを置くか

    しないと駄目だと思います。

    確か、ランタイムに関しては配布用のインストールパッケージがあったはずです。

     

    あと、OCXの登録失敗と言う時点で既に問題は出ているわけなのでスキップするのではなくて

    きちんと解決した方が良いと思います。

    インストールの順番の関係でスキップせざるえないのであれば話は別だと思うのですが。

     

    2008年10月16日 1:44
  •  PATIO さんからの引用

    あと、OCXの登録失敗と言う時点で既に問題は出ているわけなのでスキップするのではなくて

    きちんと解決した方が良いと思います。

    インストールの順番の関係でスキップせざるえないのであれば話は別だと思うのですが。

     

    インストーラーを作成する時、RegisterをvsdrpDoNotRegister としたら

    インストールはスキップなどせず正常に出来ています。

    2008年10月16日 4:43
  •  クサキ さんからの引用

     ocxも実行ファイルと同じディレクトリにあれば、レジストリ登録無しでも動かないのですか?

     VS インストーラー1.1から、レジストリ登録はしない方が良いと思っていたのですが。

    ActiveX(OCX)は基本的にレジストリ登録が必要です。

    ActiveX(OCX)を探すときは、まずレジストリの登録情報を参照し、その情報からActiveX(OCX)ファイルがどこにあるかを調べます。

    レジストリに情報がない場合は、その時点でエラーになるかと思います。

     

     クサキ さんからの引用

      インストーラ作成の時、Registerが vsdrfCOMSelfReg となっていまして、
     ”インストール中に”モジュール abc.ocx で登録に失敗しました。HRESULT -2147010895。サポート担当に問い合わせてください。”

     というエラーになりまして、
     vsdrpDoNotRegister としたらインストールは出来るようになりました。その結果での質問です。

    インストールに成功したとは言い難いです。

    必要なレジストリ登録という作業を取り除いた状態になっています。

     

    -2147010895は0x800736B1、アプリケーションの構成が正しくありませんといったエラーを指し示しています。

    レジストリ登録を行おうとした時点で、Visual C++ 2008ランタイムがインストールされていない可能性があるかもしれません。

    Visual C++ 2008ランタイムを必須コンポーネントにするか、インストール順序をずらしてください。

    2008年10月16日 13:41
    モデレータ
  • Azuleanさんのおっしゃる通りで、
    Registerを vsdrfCOMSelfReg に戻し、Visual C++ 2008ランタイムを必須コンポーネント

    したら、インストールも実行も上手く行えるようになりました。

    大変助かりました。ありがとうございました。

    2008年10月17日 2:50