トップ回答者
ActiveXのレジストリ登録

質問
-
よろしくお願いします。
現在、ActiveX(DLL)を利用するWebシステムを開発中です。
ActiveXは、PCに接続されたデバイスから値を取得するDLLで、目に見えるコントロールはありません。
Webシステムの開発環境は、LAMPです。
DLLは、VisualStudio2008のVB.NETでCOMコンポーネントで作り、
グローバルサイン社のデジタル署名済みです。
署名は、以下のサイトを参考に行いました。
http://jp.globalsign.com/support/index.php?action=artikel&cat=25&id=101&artlang=ja
javascriptで以下のようにActiveXの呼び出しを行っております。
-------------------------------------------------
<OBJECT ID="act1" WIDTH=0 HEIGHT=0
CLASSID="CLSID:c53361d3-3ac1-4bdc-86e4-○○○○○○○○○"
CODEBASE="○○○○○○○.dll##Version=1,0,0,2">
</object>-------------------------------------------------
外部のPCから該当のWebページを開くと、ActiveXのインストールを確認する画面が表示されます。
インストールを行うと、
C:\WINDOWS\Downloaded Program Files
にDLLファイルが入ります。
その後、Javascript側で
act1."関数名"
(”act1”は、OBJECT ID)
というような記述でDLLの関数を呼び出しておりますが、以下のようなエラーが生じます。
-------------------------------------------------
メッセージ: オブジェクトでサポートされていないプロパティまたはメソッドです。
ライン: 112
文字: 1
コード: 0
URI: http://192.168.○○.○○./○○/○○/○○.js
-------------------------------------------------因みに、デジタル署名前のDLLで、開発環境のPC(WindowsXP,xampp)にてDLLをコンパイルし、
動作確認したときは正常に値をとることができました。
原因としては考えていることは、
外部PCからWebページを開いたとき、
このDLLがレジストリに登録されていないため、DLLのインスタンスが生成?動作が上手くいっていないと思っています。
その解決方法が見つからず困っております。
何かお分かりの方がいらしたらアドバイスの程よろしくお願い致します。
回答
-
# すみません、少し読み違えていました。
.NET で作った COM は Regasm ツールで登録しないといけないので、CAB で配置するには少し工夫が必要です。
対象の言語が C# なのですが、次の記事が参考になります。
Downloading C# ActiveX Components through CAB File - CodeProject
http://www.codeproject.com/KB/cs/C__Deployment.aspx
Create ActiveX in .NET Step by Step - CodeProject
http://www.codeproject.com/KB/cs/CreateActiveXDotNet.aspx
アセンブリ DLL そのものではなく、一旦インストーラーを作って CAB に入れておいて、CAB をダウンロードしたときにインストーラーを実行しています。
すべての返信
-
ActiveX コントロールは安全であるとマークされていますか?
試しに該当するゾーン(インターネット ゾーンかな)の設定で
[スクリプトを実行しても安全だとマークされていない ActiveX コントロールの初期化とスクリプトの実行]
を有効にすると動いたりしませんか?
参考:
ActiveX セキュリティ : 強化点とベスト プラクティス
http://msdn.microsoft.com/ja-jp/library/bb250471(VS.85).aspx
累積的なセキュリティ更新プログラム 896688 (MS05-052) で導入された多層防御の変更が原因で、カスタム ActiveX コントロールを含む Web ページが Internet Explorer に正常に読み込まれないことがある
http://support.microsoft.com/kb/909738/ja
[INFO] Internet Explorer における、ActiveX コントロールが安全かどうかの判断方法
http://support.microsoft.com/kb/216434/ja
How to implement IObjectSafety in VB.Net - Sujith Nair - Site Home - MSDN Blogs
http://blogs.msdn.com/b/sujithr/archive/2008/05/06/how-to-implement-iobjectsafety-in-vb-net.aspx -
>totojoさん
ご返答有りがとうございます。
IEのセキュリティ設定は、インターネットゾーンもイントラの方もすべて動かす設定にしましたがだめでした。
安全マークに関しては、
> How to implement IObjectSafety in VB.Net - Sujith Nair - Site Home - MSDN Blogs
を参考に試してみましたが、動作に改善はございませんでした。
msdnの有料サポートを申し込もうと思っていますが、
そもそもVS2008とvisual basicの言語だけで実現できるのかをmicrosoftに電話で確認中です。
が、、、調べて折り返し電話をくれると言われたっきり返答がきません。
実現可能なら有料サポートを契約しますが・・・といった状況で身動きができない状態です。
-
totojoさん
いつもご返答、誠にありがとうございます。
Frameworkは入っております。
なお、DLL側は、v2.0...のバージョンで構成しました。
また、試しにVB6.0でOCXを作り、DLLのtlbを参照させ、DLLの関数を呼んでも上手くいきませんでした。
(Cabにしてjavascriptから呼び出してます。コンパイル環境からは正常に動作します)
エラー内容は、DLLのインスタンスを生成する際、
Public obj As Object
Set obj = CreateObject("○○○.○○")
または
Public obj As New ○○○.○○
のどちらを呼び出しても
「実行時エラー’429’ActiceXコンポーネントはオブジェクトを生成できません」
ときます。
DLLが見えていない状態でしょうか。
その際、C:\WINDOWS\Downloaded Program Filesには、Infファイルとocxが入り、
system32フォルダには、DLLが入ります。
(Infファイルの設定どおり)
行き詰まりを感じるので、VB6、OCXのみで作り直そうか検討しだしました・・・。
(.netのSystem.IO.Portsがないのでそっちには手を出したくないのです・・・
それと、私の知識レベルだとそっちも大変そうだと感じてます)
そういえば、microsoftからは、VB.NETでCOMやActiveXはつくれないといわれました(笑)
ActiveXはMSの仕様だし、VSにCOMのテンプレートがメニューにありますよと話したら、
調べなおしますといわれました・・・
-
本筋にアドバイスできなくて申し訳ありません。
そういえば、microsoftからは、VB.NETでCOMやActiveXはつくれないといわれました(笑)
ActiveXはMSの仕様だし、VSにCOMのテンプレートがメニューにありますよと話したら、このテンプレートがあるというのはどういったことでしょうか?
単にクラスライブラリを作ったときのプロジェクトのプロパティに「アセンブリを COM 参照を可能にする」というチェックボックスを示唆されているのでしょうか?新規プロジェクトのテンプレートとしては、VB.NET/C# には標準では存在しないのですが、それがあるように記載されているように見受けられたためにお聞きしました。
# 一昔前に .NET で COM として作ったときは、アセンブリが参照できないなどトラブルが続いて大変な記憶しかなく…。
# ActiveX として参照するための正攻法につなげられるほどのネタを持てていません。
質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。 -
# すみません、少し読み違えていました。
.NET で作った COM は Regasm ツールで登録しないといけないので、CAB で配置するには少し工夫が必要です。
対象の言語が C# なのですが、次の記事が参考になります。
Downloading C# ActiveX Components through CAB File - CodeProject
http://www.codeproject.com/KB/cs/C__Deployment.aspx
Create ActiveX in .NET Step by Step - CodeProject
http://www.codeproject.com/KB/cs/CreateActiveXDotNet.aspx
アセンブリ DLL そのものではなく、一旦インストーラーを作って CAB に入れておいて、CAB をダウンロードしたときにインストーラーを実行しています。 -
こんにちは、フラー さん。
MSDN フォーラムのご利用ありがとうございます。オペレーターの山本です。
時間がたっていますが、その後いかがでしょうか。
totojo さんからの投稿は有効な情報であるかと思いましたので、勝手ながら私のほうで回答としてマークさせていただきました。
totojo さん、情報ありがとうございます。
今後同じ問題でこのスレッドを参照される方にも、有効な情報が分かりやすくなるかと思いますので、回答としてマークのご協力をお願いいたしますね。
もしまだ問題解決していないようでしたら、現在の状況を記載いただいて、ご質問を続けてくださいね。
今後とも、MSDN フォーラムをよろしくお願いいたします。
日本マイクロソフト株式会社 フォーラム オペレーター 山本 春海 -
-
このテンプレートがあるというのはどういったことでしょうか?
単にクラスライブラリを作ったときのプロジェクトのプロパティに「アセンブリを COM 参照を可能にする」というチェックボックスを示唆されているのでしょうか?新規プロジェクトのテンプレートとしては、VB.NET/C# には標準では存在しないのですが、それがあるように記載されているように見受けられたためにお聞きしました。
テンプレートは、クラスライブラリなどで新規にプロジェクトを作成した後、[追加]でCOMコンポーネントがあります。
今回の開発での私の結論として、
DLLの前にOCXをかますことでうまくいきました。
さらに・・・・試しに、今回のOCXの役割の部分を
VS2003とVS2005でDLLとして実装(VS2003とVS2005は同一ソース)してみたところ、
VS2003で作ったものをかますと正常に動作しました。
という結果から、
Framework1...のバージョンより前の仕様でブリッジ的なものを作れば
セキュリティ的な面を回避して作れるのかなという結論になりました。
(あくまで安易な自論であり、結果論です。間違ってたらすみません。)
苦労しましたが、Azuleanさんとtotojoさんのおかげで解決に至りました。
これがまた誰かの役に立てればと思います。
ご返答ありがとうございました。