ActiveXのインストールでハマったのでメモ。
お客様に納品しているソフトウェアは、開発言語が Microsoft Visual Basic 6.0(以下、VB6)で、AxtiveXで提供されているものがある。
ActiveXでソフトウェアを提供する事によって、Microsoft Internet Explorer(以下、IE)上で Windows ネイティブなプログラムを実行する事ができるため、WEB経由で動作するシステム上で、IE 上でシームレスにプログラムを動かせるので、便利に使用してソフトウェアを開発していた。
また、ActiveXが持つ機能を使用して VB6 のランタイムライブラリも自動的に必要なDLLのみがインストールされるのも便利なところだ。
しかしながら、昨今はセキュリティがひじょうに厳しくなった事もあって、ブラウザ上でネイティブなコードを実行できる ActiveX は避けられる方向にある。
代表例は Flash で、過去は、サイトのトップページで多用されていたが、現在は、スマートフォン端末やタブレット端末で使用できない事もあり、昨今では、ほとんど使われなくなった。
また、VB6 は、開発環境としては古いものであり、現行でマイクロソフトのサポートサイクル内にあるOSでは、Windows Vista までしか開発環境のインストールはサポートされていないものである。
開発ツール対応 OS 一覧
とは言え、お客様に納品しているソフトウェアは、そう簡単に新しいものには変えられないので、使える限りは、使い続ける事が原則だ。マイクロソフトの都合や、開発サイドの都合で、問題なく動いているものを、わざわざお金をかけて作り直しなどさせてはくれない。
そういうわけで、過去に VB6 + ActiveX で納品したソフトウェアの改修を行う事になったのだが、問題が発生した。
まず、ユーザ様の環境に合わせたテスト環境し、過去に納品した ActiveX のインストールを試してみる。
最新の IE である IE11 に合わせて若干の調整が必要であったが、インストールは問題なくでき、ActiveX は問題なく動作した。
ここまでは順調だ。
後日、プログラムを改修した ActiveX のパッケージで、インストールを試したところ、今度は問題が発生した。
ActiveX をインストールする旨のダイアログは表示されるが、インストールに失敗してしまう。エラーも何も出ない。
インストールはスタートするのに、何も言わずに終了し、インストールに失敗してしまう。
なぜだ?
新しく作成した ActiveX のパッケージがおかしいのか?
試しに、先にインストールが成功した、過去に納品した ActiveX を一旦削除して、もう一度インストールをしてみると、こちらもインストールできなかった。
いったい何が起こっているのだ?
IE の「インターネット オプション」の設定を変更し、セキュリティを緩々にしてみる。
インストールできない。
テスト環境は ESXi 上に作成しているので、インストール操作を行う前にバックアップした環境を書き戻してみる(インストールに成功した環境に戻してみる)。
インストールできない。
んんんん??
ActiveX のインストールが行われる際に、IE は Temporary Internet Files にログを残すので、これを参照してみる。
すると…
*** Code Download Log entry (20 Nov 2015 @ 23:35:09) ***
Code Download Error: (hr = 800c0007) 要求されたリソースのデータは使用できません。Operation failed. Detailed Information:
CodeBase: http://***********************
CLSID: {********-****-****-****-************}
Extension:
Type:LOG: Item **********.ocx being processed.
--- Detailed Error Log Follows ---
LOG: Download OnStopBinding called (hrStatus = 0 / hrResponseHdr = 0).
LOG: Item **********.ocx being processed.
LOG: Item MSVCRT.DLL being processed.
LOG: Item MSINET.OCX being processed.
LOG: Item INETJP.DLL being processed.
LOG: Item COMDLG32.OCX being processed.
LOG: Item CMDLGJP.DLL being processed.
LOG: Item MSCOMCTL.OCX being processed.
LOG: Item MSCMCJP.DLL being processed.
LOG: Item msvbvm60.dll being processed.
LOG: Item OLEAUT32.DLL being processed.
LOG: Item OLEPRO32.DLL being processed.
LOG: Item ASYCFILT.DLL being processed.
LOG: Item STDOLE2.TLB being processed.
LOG: Item COMCAT.DLL being processed.
LOG: Item VB6JP.DLL being processed.
LOG: URL Download Complete: hrStatus:0, hrOSB:0, hrResponseHdr:0, URL:(http://***********************.CAB)
LOG: Download OnStopBinding called (hrStatus = 800c0007 / hrResponseHdr = 8007007e).
LOG: Redundant download attempted, but no more codebases available.
LOG: URL Download Complete: hrStatus:800c0007, hrOSB:0, hrResponseHdr:8007007e, URL:(http://activex.microsoft.com/controls/vb6/VB6JP.cab)
LOG: Reporting Code Download Completion: (hr:800c0007 (FAILED), CLASSID: d80b51ca..., szCODE:(http://***********************.CAB), MainType:(null), MainExt:(null))
2行目でエラー「800c0007」が記録されている。
その原因は、下から2行目の、リターンコード「8007007e」のようだ。
エラーとして記録されているURLは、これだ。
http://activex.microsoft.com/controls/vb6/VB6JP.cab
えぇ~?
activex.microsoft.com 上のパッケージにアクセスできない?
wget コマンドでダウンロードを試みてみる。
$ wget http://activex.microsoft.com/controls/vb6/VB6JP.cab
--2015-11-20 23:49:35-- http://activex.microsoft.com/controls/vb6/VB6JP.cab
activex.microsoft.com をDNSに問いあわせています... 61.213.151.18, 61.213.151.10
activex.microsoft.com|61.213.151.18|:80 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 404 Not Found
2015-11-20 23:49:36 エラー 404: Not Found。
$
404 Not Found…。orz
nslookup で activex.microsoft.com を引いてみる。
$ nslookup activex.microsoft.com
Server: XXX.XXX.XXX.XXX
Address: XXX.XXX.XXX.XXX#53Non-authoritative answer:
activex.microsoft.com canonical name = activex.microsoft.com.edgesuite.net.
activex.microsoft.com.edgesuite.net canonical name = a1670.g2.akamai.net.
Name: a1670.g2.akamai.net
Address: 61.213.151.10
Name: a1670.g2.akamai.net
Address: 61.213.151.18
$
DNSは引けるが、何だよ、この akamai.net って。
2日待ってみたが、一向に復旧しない。
サーバ activex.microsoft.com の障害って、どこに連絡をすればよいのだ?
マイクロソフトのMSDNのサポートに電話をしてみる。
が…まったく要領を得ない。
サポート窓口の人は、技術的な事はまったくわからないようで、「ActiveX」も、「activex.microsoft.com」も、拡張子「.CAB」も、「DNS」も、「nslookup」も通じない。
文字通り、話にならない。まったく埒があかない。
結局、最後はこうだ。
このサーバは、時々アクセスできなくなる事があるようです。
しばらくお待ちいただければ復旧すると思います。
このサーバに関する連絡窓口はございません。
いやいや、「時々、アクセスできなくなる事がある」って、おかしいやろ。
「このサーバに関する連絡窓口はございません」って、おかしいやろ。
activex.microsoft.com が動いていないという事は、世界中で ActiveX のインストールができない状態になってるって事だぞ。そんな重要なサーバが、何日も落ちっぱなしっておかしいやろ。
ちなみに、実は7年前にも似たような事があった。
【プログラミング】ActiveXで大ハマリ
この時は、完全にアクセスできないのではなく、不安定な状態で、ダウンロードできたり、できなかったり、という状況で、パッケージをローカル・サーバに置くことで回避できた。
しかし今回は、まったくアクセスできないので、パッケージを手元に置こうにも、そのパッケージのダウンロードもできない。
どうにもならない。
マイクロソフト君、しっかりしてくれ。
■2015/11/26 追記
再度マイクロソフトに問い合わせてみたけれど、やっぱり「わからない」という回答。
なんだかなぁ。
仕方がないので、activex.microsoft.com からのダウンロードは諦め、開発PC上の DLL や OCX が正であると考えて、パッケージを作成するときに、DLL や OCX をすべてパッケージに含めるように設定を変更してパッケージを作成。
当然の如く、パッケージは肥大化し、約200KBだったCABが、10倍の2MBに。
$ ls -l
-rw-r--r--. 1 zunbe zunbe 206058 3月 13 21:56 2013 OLD-ActiveX.CAB
-rw-r--r--. 1 zunbe zunbe 2007507 11月 26 05:20 2015 NEW-ActiveX.CAB
これで一応、新しい ActiveX をインストールする事はできるようになった。
ファイルのサイズは大きくなってしまったが、これはヨシとする。
とりあえずは、これでいい。
しかし、まだ問題が。
プログラムの検証をするために、旧版の ActiveX をインストールしなければならない。
ずんべ 自身がインストールするだけなら、ランタイム・ライブラリをインストールした上で、旧版の ActiveX を regsvr32 で登録すれば何とかなるが、お客様もでも同様に新旧両方の ActiveX をインストールして検証をする必要があるので、お客様には「regsvr32で」というわけにはいかない。
仕方がないので、作成した新版のパッケージを元に、旧版のパッケージを手動で作成する事にする。
まず、作成した新版の CAB を一旦解凍する。
新版の ActiveX を、旧版の ActiveX に差し替える。
INF ファイルも手動で修正する。
再び CAB に固める。
作成した旧版のパッケージで、インストールをトライしてみると、無事成功。
やれやれだぜ。(空条承太郎風)