none
ActiveXのレジストリ登録 RRS feed

  • 質問

  • よろしくお願いします。

     

    現在、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のインスタンスが生成?動作が上手くいっていないと思っています。

    その解決方法が見つからず困っております。

    何かお分かりの方がいらしたらアドバイスの程よろしくお願い致します。

     

    2011年1月29日 10:13

回答

  • # すみません、少し読み違えていました。

    .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 をダウンロードしたときにインストーラーを実行しています。
    • 回答としてマーク 山本春海 2011年2月21日 5:53
    • 回答としてマークされていない フラー 2011年2月25日 9:06
    • 回答としてマーク フラー 2011年2月25日 9:21
    2011年2月5日 16:36

すべての返信

  • 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
    2011年1月29日 18:35
  • >totojoさん

    ご返答有りがとうございます。

    IEのセキュリティ設定は、インターネットゾーンもイントラの方もすべて動かす設定にしましたがだめでした。

    安全マークに関しては、

    > How to implement IObjectSafety in VB.Net - Sujith Nair - Site Home - MSDN Blogs

    を参考に試してみましたが、動作に改善はございませんでした。

    msdnの有料サポートを申し込もうと思っていますが、

    そもそもVS2008とvisual basicの言語だけで実現できるのかをmicrosoftに電話で確認中です。

    が、、、調べて折り返し電話をくれると言われたっきり返答がきません。

    実現可能なら有料サポートを契約しますが・・・といった状況で身動きができない状態です。

     

    2011年2月4日 7:49
  • 外部の PC に .NET Framework がインストールされていない、なんてことはないですよねぇ。
    2011年2月4日 8:27
  • 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のテンプレートがメニューにありますよと話したら、

    調べなおしますといわれました・・・

    2011年2月5日 5:46
  • 本筋にアドバイスできなくて申し訳ありません。

    そういえば、microsoftからは、VB.NETでCOMやActiveXはつくれないといわれました(笑)
    ActiveXはMSの仕様だし、VSにCOMのテンプレートがメニューにありますよと話したら、

    このテンプレートがあるというのはどういったことでしょうか?
    単にクラスライブラリを作ったときのプロジェクトのプロパティに「アセンブリを COM 参照を可能にする」というチェックボックスを示唆されているのでしょうか?

    新規プロジェクトのテンプレートとしては、VB.NET/C# には標準では存在しないのですが、それがあるように記載されているように見受けられたためにお聞きしました。

     

    # 一昔前に .NET で COM として作ったときは、アセンブリが参照できないなどトラブルが続いて大変な記憶しかなく…。
    # ActiveX として参照するための正攻法につなげられるほどのネタを持てていません。


    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
    2011年2月5日 7:41
    モデレータ
  • # すみません、少し読み違えていました。

    .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 をダウンロードしたときにインストーラーを実行しています。
    • 回答としてマーク 山本春海 2011年2月21日 5:53
    • 回答としてマークされていない フラー 2011年2月25日 9:06
    • 回答としてマーク フラー 2011年2月25日 9:21
    2011年2月5日 16:36
  • こんにちは、フラー さん。

    MSDN フォーラムのご利用ありがとうございます。オペレーターの山本です。

    時間がたっていますが、その後いかがでしょうか。
    totojo さんからの投稿は有効な情報であるかと思いましたので、勝手ながら私のほうで回答としてマークさせていただきました。
    totojo さん、情報ありがとうございます。

    今後同じ問題でこのスレッドを参照される方にも、有効な情報が分かりやすくなるかと思いますので、回答としてマークのご協力をお願いいたしますね。

    もしまだ問題解決していないようでしたら、現在の状況を記載いただいて、ご質問を続けてくださいね。

    今後とも、MSDN フォーラムをよろしくお願いいたします。
                                                                               
    日本マイクロソフト株式会社 フォーラム オペレーター 山本 春海

     

    • 回答としてマーク フラー 2011年2月25日 9:04
    • 回答としてマークされていない フラー 2011年2月25日 9:07
    2011年2月21日 5:53
  • totojoさん

    返答が遅くなり失礼しました。

    ご返答ありがとうございます。

    結局のところ、Regasmで登録をすることで、対応できました。

    また、VB6でOCXをかませることにより、うまくいったという点もあります。

    (Frameworkの仕様の差だと思われます。)

    この方法を応用して、一つのActiveXで32bit64bitでも動作できるよう対応できました。

    度々ご返答いただき大変ありがとうございました。

    • 回答としてマーク フラー 2011年2月25日 9:04
    • 回答としてマークされていない フラー 2011年2月25日 9:07
    2011年2月25日 9:03
  • このテンプレートがあるというのはどういったことでしょうか?
    単にクラスライブラリを作ったときのプロジェクトのプロパティに「アセンブリを COM 参照を可能にする」というチェックボックスを示唆されているのでしょうか?

    新規プロジェクトのテンプレートとしては、VB.NET/C# には標準では存在しないのですが、それがあるように記載されているように見受けられたためにお聞きしました。

    テンプレートは、クラスライブラリなどで新規にプロジェクトを作成した後、[追加]でCOMコンポーネントがあります。

    今回の開発での私の結論として、

    DLLの前にOCXをかますことでうまくいきました。

    さらに・・・・試しに、今回のOCXの役割の部分を

    VS2003とVS2005でDLLとして実装(VS2003とVS2005は同一ソース)してみたところ、

    VS2003で作ったものをかますと正常に動作しました。

     

    という結果から、

    Framework1...のバージョンより前の仕様でブリッジ的なものを作れば

    セキュリティ的な面を回避して作れるのかなという結論になりました。

    (あくまで安易な自論であり、結果論です。間違ってたらすみません。)

     

    苦労しましたが、Azuleanさんとtotojoさんのおかげで解決に至りました。

    これがまた誰かの役に立てればと思います。

    ご返答ありがとうございました。

    2011年2月25日 9:21