ActiveXの登録情報について

解決


イン  2012-04-16 19:36:14  No: 103262

考えてたら混乱してきたので、教えてください。
System32にあるOCXのファイルはもともとOSにあるものですよね?
すでにレジストリにも登録済みという認識でいます。
以前、あるOcxがないというエラーになって、再登録(Regsvr32)したら解決できたことがありました。
これは、Ocxファイル自体はあるけどレジストリに登録されていないから出てしまったエラーになるのですか?
またSystem32からOcxファイル自体をなくしても同様にエラーが出るかと思います。
じゃあアプリ自体はレジストリもSystem32の中も参照しているということですか?
どのような手順で参照しているのかいまいち仕組みが分かりません。
簡単な説明いただけると助かります。
よろしくお願いします。


魔界の仮面弁士  2012-04-16 22:35:14  No: 103263

> System32にあるOCXのファイルはもともとOSにあるものですよね?
OS 付属のファイルの場合もあれば、アプリケーション製品によって
導入されるものもありますね。

> すでにレジストリにも登録済みという認識でいます。
登録済みの可能性が高いですが、その保証はありません。

たとえばインストールとアンインストールを繰り返した場合、
何らかの理由で、レジストリとの整合性が合わなくなることはあります。

> 以前、あるOcxがないというエラーになって、再登録(Regsvr32)したら解決できたことがありました。
> これは、Ocxファイル自体はあるけどレジストリに登録されていないから出てしまったエラーになるのですか?
恐らくそうだと思います。

> またSystem32からOcxファイル自体をなくしても同様にエラーが出るかと思います。
OCX の置き場所は System32 とは限りません。
たとえば、Common Files や Program Files の配下に置かれる事もあります。

レジストリ等で場所が正しく指定されてさえいれば、それこそ
CD-ROM 上などのパスであっても動作します。たとえば、複数のフォルダーに
同じファイルの異なるバージョンが置かれており、どのファイルが使われるかは
レジストリやマニフェストで指定されている…という場合もあります。

> じゃあアプリ自体はレジストリもSystem32の中も参照しているということですか?
> どのような手順で参照しているのかいまいち仕組みが分かりません。
> 簡単な説明いただけると助かります。
具体的な例を挙げれば、たとえばレジストリの
  HKEY_LOCAL_MACHINE\SOFTWARE\Classes\TypeLib\{F9043C88-F6F2-101A-A3C9-08002B2F49FB}
  HKEY_CLASSES_ROOT\CLSID\{F9043C85-F6F2-101A-A3C9-08002B2F49FB}
に書かれた内容が参照されることになります。

上記の「{F9043C85-F6F2-101A-A3C9-08002B2F49FB}」というのは、
コモンダイアログ コントロール(COMDLG32.OCX)の識別子(GUID)であり、そこに
実際の COMDLG32.OCX へのパス(C:\Windows\System32\comdlg32.ocx など)が
記載されています。
あとはそのパスを基に、実際のファイルがロードされる……という仕組みです。

実際には上記の他、
  HKEY_CLASSES_ROOT\MSComDlg.CommonDialog
  HKEY_LOCAL_MACHINE\SOFTWARE\Classes\MSComDlg.CommonDialog

  HKEY_CLASSES_ROOT\Licenses\4D553650-6ABE-11cf-8ADB-00AA00C00905
  HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Licenses\4D553650-6ABE-11cf-8ADB-00AA00C00905

  HKEY_CURRENT_USER\Software\Classes\TYPELIB\{F9043C88-F6F2-101A-A3C9-08002B2F49FB}
などなど、各種情報があるのですが、今回は細かい説明は省きます。

http://support.microsoft.com/kb/183771/ja

なお、呼び出し元が EXE の場合には、SxS (サイドバイサイド) という
仕組みを使う事で、レジストリ登録無しで動作させることもできます。
http://msdn.microsoft.com/ja-jp/library/cc482775.aspx
http://msdn.microsoft.com/ja-jp/library/ms811700.aspx
http://support.microsoft.com/kb/828629/ja


イン  2012-04-16 22:58:24  No: 103264

魔界の仮面弁士さん丁寧な説明ありがとうございます。
わかりやすいです。

では、例えばVBにてアプリ作成を行い、VBが入っていないPCにExeをおく場合は使用しているOCXも一緒にインストールして、登録を行うのが本来行うべきことでしょうか?
ランタイムライブラリは同じこと?

上記で説明があったコモンダイアログ コントロールCommonDialog1を使用していたとして、開発用のPCでは問題ないのにExeをインストールしたPCでCommonDialog1を使用している場所(一番最初)で例外エラーになる場合は、インストールPCの方でCommonDialog1が登録されていないことになるのでしょうか?
→この場合は再登録「Regsvr32」で解決できるはず?

よろしくお願いします。


魔界の仮面弁士  2012-04-17 00:56:22  No: 103265

> では、例えばVBにてアプリ作成を行い、VBが入っていないPCにExeをおく場合は
> 使用しているOCXも一緒にインストールして、登録を行うのが本来行うべきことでしょうか?

各種ランタイムが導入済みの環境であれば省略できますが、そうでないなら
アプリと共にインストールするようにしてください。この時はできるだけ、
配布用の「インストーラー」を用意しておくことが望ましいです。

EXE にしても OCX にしても DLL にしても、そのファイル単体で
構成されるわけではありません。多くの場合、他の依存ファイル群と
連携して動作するようにできています。

たとえば ComDlg32.ocx ver 6.1.97.82の場合、それ自身に加えて
ComCat.dll という依存コンポーネントが必要となります。
また、日本語版ではさらに CmDlgJP.dll も必要となりますし、
フランス語版なら CmDlgFR.dll が必要となります。
もちろん、先述したようにレジストリ設定も必要ですね。

もし、十分な知識のないユーザーによって手動コピーで配置された場合、
誤って一部のファイルだけ置き換えられたり、古いバージョンや
多言語バージョンのファイルで上書きされてしまう危険性があり、時には
バージョン互換性の問題を引き起こしてしまう危険性が生じます。
(この問題は俗に、「DLL Hell」あるいは「DLL 地獄」と呼ばれています)
http://msdn.microsoft.com/ja-jp/library/dd297693.aspx

> ランタイムライブラリは同じこと?
実行時(rumtime)に必要なライブラリ群という意味では、
広義には ocx もランタイムの一部であるといえます。

なお、ランタイムやその依存ファイル等をそれ単体で再頒布することは
許可されていないのでご注意ください。
VB 製の自作アプリと共に配布する分には問題ありません。

> 開発用のPCでは問題ないのにExeをインストールしたPCで
> CommonDialog1を使用している場所(一番最初)で例外エラーになる場合は、
そのコントロールは、どのようにして再頒布されましたか?
また、コントロールをどのように使用されていますか?

たとえば同コントロールを Excel のシートに貼って使う事はできません。
これは、ActiveX コントロールを画面に貼るときには、開発用のライセンス
すなわちデザインタイムライセンスが要求されるためです。
(開発環境であれば問題なく動作するのですけれどね)

一方、VB6 のフォームに貼って出荷するような場合は、その EXE 内に
ocx ライセンス情報が埋め込まれるので、その場合には
ランタイムライブラリだけで動作することになります。

また、Web アプリに貼って Internet Explorer 上で利用するような場合は、
サーバー側にライセンスファイル(*.LPK) が要求されます。

なお、こうしたデザインタイムライセンスに関する事情は、
VB.NET の場合も同様です。とはいえそもそも VB.NET で 
CommonDialog の ocx を使う事は無いでしょうけれども。

> インストールPCの方でCommonDialog1が登録されていないことになるのでしょうか?
> →この場合は再登録「Regsvr32」で解決できるはず?

解決できるかも知れませんし、あるいは解決できないかも知れません。

そもそも VB のバージョンはおろか、エラーメッセージすら
提示されていない現状では、実際の環境を見ていない第三者には、
エラーの原因は分からないと思いますよ。

ただしいずれにせよ、適切なインストーラーからセットアップすれば、
解決できる可能性が高いであろうとは思います。


イン  2012-04-17 01:30:04  No: 103266

ご教授ありがとうございます。
勉強になります。

いまさらですが
開発環境 vb6
WindowsXP

実際にエラーは例外処理がなされているので何が出ているかわかりません。わかることは最初に使用している部分でしくじっていて、その部分を自PCで確認すると問題なく動作するので、PCの環境でエラーになっている可能性を考えています。
VBフォームに貼り付けています。

再登録「Regsvr32」は行いますが、他に原因があるのかを模索中です。


魔界の仮面弁士  2012-04-17 02:18:49  No: 103267

http://www.tt.rim.or.jp/~rudyard/torii009.html

>> エラーメッセージすら提示されていない現状では
> 実際にエラーは例外処理がなされているので何が出ているかわかりません。
実行時エラーの発生時に、それを握りつぶしているということでしょうか?

それとも、例外 c0000005(アクセス違反) などの致命的なエラーで
先にすすめないという事でしょうか?

> PCの環境でエラーになっている可能性を考えています。
ランタイム等は、その環境にどのようにしてセットアップされましたか?

出荷時に VB6 製アプリがプリインストールしてある環境なら別ですが、
素の WinXP 本体には、VB6 ランタイムや ocx は完全には揃っていません。

一応、MSVBVM60.DLL (VB6 のコアランタイム)ぐらいなら
同梱されているのですが、日本語ライブラリ(VB6JP.DLL)や
各種 OCX (とその依存ファイル群)などは、必ずしも
含まれているわけではないことに注意してください。

そのため、特に ActiveX コンポーネントを利用するようなコードでは、
ランタイム群のインストールを(最低一回は)実施しておく必要があります。

具体的な手順等についは、VB6のヘルプ(MSDNライブラリ)の

  [Visual Basic ドキュメント]
  └[Visual Basic の使用方法]
    └[プログラミング ガイド]
      └[Visual Basic を使ってできること]
        └[作成したアプリケーションの配布]

という項目をご覧下さい。もしもよく分からなければ、窓の杜などから
いわゆる「VB6 ランタイムセット」を導入しておくと良いでしょう。


イン  2012-04-17 18:32:15  No: 103268

魔界の仮面弁士さん
ありがとうございます。
とにかくランタイムがちゃんとインストールされているかあやしいところです。SetUpファイルを見るとVBで作成したアプリと一緒にOcxファイルもDiskIageに含まれています。(InstallShieldにて作成したセットアップ)

例えばVB6ランタイムをダウンロードするとsetup.exeがあり、これを実行することで、Regsvr32も同時にしているイメージでよいでしょうか?

InstallShieldのSetUpではDiskImageにOCXファイルがあるものの実際登録はしているのか?

また、InstallSheildは中身でランタイムを登録するようにセットアップファイルを作成するそういった設定ができるのか?
(すいません、InstallShieldの質問になってしまっていますが…)


魔界の仮面弁士  2012-04-17 21:06:07  No: 103269

Windows Installer ベースのセットアップだとすれば、
ocx の Register プロパティを vsifrSelfReg(1) にすることになります。

必要な依存ファイルについては、開発環境の *.DEP ファイルに
書かれていますので、そちらを参照してみてください。もしくは、
InstallShield で最新のマージモジュールが用意されているならば、
そちらを使ってみても良いでしょう。

なお InstallShield で生じた問題については、Microsoft の
サポート対象外なので、メーカーに問い合わせてみてください。
http://support.microsoft.com/kb/167053/ja

(どちらにせよ今となっては、Microsoft 側でも VB6 のサポートは限定的ですが…)


イン  2012-04-17 23:38:32  No: 103270

*.DEPファイルありません…

必要なものはInstallSheildで作成する際に再配布可能ファイルの項目をチェックしてインストールさせるように設定するのですね。

それをしなければランタイムライブラリを別にセットアップしないと、標準でOSに入っていないものがあると動かないよってことですよね?


魔界の仮面弁士  2012-04-18 01:48:07  No: 103271

> *.DEPファイルありません…

VB6 開発環境をインストールすると、C:\Windows\System32)
(64bit OS なら C:\Windows\SysWOW64) の下に COMDLG32.DEP などの
*.DEP ファイルが配置されるかと思いますが、ありませんか?

Visual Studio Installer やディストリビューション ウィザードでは、
このファイルから依存関係情報を読み取っています。

ただし、マージモジュール(*.msm)を使うタイプのインストーラーの場合、
その *.msm ファイル内に依存情報が記録されていますので、必ずしも
インストーラ作成環境に dep ファイルが必須というわけではありません。

ちなみに VB6 SP6 用のマージモジュールは下記にあります。
http://www.microsoft.com/downloads/ja-jp/details.aspx?FamilyID=f9d19334-61ec-48cf-bb4e-3aec65edd50b&displaylang=ja

> 必要なものはInstallSheildで作成する際に再配布可能ファイルの項目を
> チェックしてインストールさせるように設定するのですね。
私は、InstallShield の利用経験が皆無なので、そういった
具体的な手順については答えられないです。
(普段は Visual Studio Installer やディストリビューション ウィザードを利用)

なお、InstallShield の方で msm が提供されている場合は、
そちらの指示にも従ってみてください。というのも、かつて
Microsoft 提供のマージモジュールにおいて、MDAC 2.8 を
配置できないという話があったときに、米InstallShield で
独自に MDAC 2.8 のマージモジュールをリリースしたという
実績があったそうなので。


イン  2012-04-18 01:55:33  No: 103272

魔界の仮面弁士さん
マンツーマンありがとうございます。
DEPファイルありました、中身みると参考になります。

色々勉強になりました。
また何かありましたらよろしくお願いします。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加