10

2012 年に初めて ActiveX コントロールを作成することになるとは思っていませんでしたが (確かにそれには正当な理由があります)、Windows 7 (x64) で実行するのに苦労しています。

ソリューション ショート ストーリー: 一部の regasm 呼び出しで /codebase が欠落しており、32 ビット プロセスと 64 ビット プロセスが混同されていましたが、標準の VS2010 コマンド プロンプトでは regasm と cscript の 32 ビット パスと 64 ビット パスが混同されていましたが、これは役に立ちませんでした。 .

長い話は次のとおりです。

私はその間を跳ね回っています

C# を使用して .Net で ActiveX コントロールを作成する

おっと 、間違ったリンクがありました..最初に提供したリンクは、元のブログページをコピーした誰かだったようです)

C# を使用して .Net で ActiveX コントロールを作成する

C# ActiveX コントロール (CSActiveX)

そして、私はプロジェクトを正常に構築しているようです (後者のプロジェクトでは、リソース コンパイラの場所を正しい場所に変更する必要がありました)。

最初のプロジェクトでは、提案されたインストーラーを使用しています。2 番目のプロジェクトでは、regasm を直接使用しようとしています。

しかし、この後、すべてが下り坂になります。私はすべてのものを登録しようとしますが、次のいずれかです:

  1. それらをどのように登録すればよいかわかりません。または:
  2. それらをどのように登録すればよいかわかりません。

私のテストケースは、以下を含む単純な JScript ファイルでした

var x = new ActiveXObject( "name of object" );

次のエラーで失敗します。

test.js(1,1) Microsoft JScript ランタイム エラー: Automation Server はオブジェクトを作成できません

これがパーミッションの問題なのか、32 ビットと 64 ビットの問題なのか、その組み合わせなのかはわかりません。

ActiveX に関するヘルプを提供しているサイトの多くは、Web ページ経由でアクセスすることを想定しているため、IE のアクセス許可を調べてみました (ただし、コントロールをサード パート プログラムにロードしたいのですが)。

regasm の「framework」バージョンまたは「framework64」バージョンのどちらを使用しているかを知っています。レジストリ エントリのどこに配置するかを制御できます。また、cscript を 32 ビットまたは 64 ビットとして実行することへの参照もいくつか見てきました。呼び出された cmd シェルに応じて、レジストリが検索されます (そして、「管理者」シェルを試すだけでなく、両方の方法も試しました)。

基本的に、この時点では、自分が何をしているのか、何をすべきなのかわかりません。

私の目標は、Windows 7 x64 に ActiveX コントロールを登録し、次の方法で読み込めるようにすることです。

  1. デフォルトの Windows コマンド プロンプトから実行されるテスト .js スクリプト
  2. 同じコントロールを Excel 2007 VBA などにロードします (テストのみ)。
  3. コントロールをサード パート アプリケーション (Rockwell の RSView Studio) にロードし、VBA アプリケーション内でホストします (これが 32 ビット プログラムか 64 ビット プログラムかを確認する必要があります。前者だと思います)。

ノート

インストーラーを使用するプロジェクト (C# を使用して .Net で ActiveX コントロールを作成する) の場合、コードを「c:\program Files (x86)\」にインストールし、regedit で検索すると、「Computer\HKEY_CLASSES_ROOT\Wow6432Node\」の下にエントリが見つかります。 CLSID\" は、DLL が 32 ビット プロセスとしてインストールされたことを示していると思われます。32 ビットと 64 ビットの両方の cmd から cscript テストを実行しようとしましたが、どちらも失敗します。インストーラーは、実行時に「regasm /codebase」に相当するものを作成していたことに注意してください。

regasm を使用して登録しようとしたプロジェクト (C# ActiveX コントロール (CSActiveX)) には、ActiveX COM コントロールを登録するための追加コードが含まれています。このコードは、32 ビットのインプロセス サーバーの登録について言及しています (ActiveXCtrlHelpers.cs を参照)。

(ところで、私は現在 Safari/Lion でも自動修正を呪っています。小文字の "DLL" を "all" に変更し続けています)


編集 2012-08-07

私が発見したアートの答えに促されて:

標準の VS2010 コマンド プロンプトから

標準の VS2010 コマンド プロンプトで (および管理者として regasm による変更の実行を許可して) 'regasm /codebase' を実行すると、HKEY_CLASSES_ROOT\Wow6432Node\CLSID の下のレジストリにエントリがダンプされ、同じプロンプトからテスト スクリプトが失敗しました。

ただし、Excel 2007 (32 ビット) で ActiveX コントロールを確認できます。

x64 Win64 VS2010 コマンド プロンプトから

VS2010 x64 Win64 コマンド プロンプトで (再び管理者として) 実行すると、レジストリ エントリは HKEY_CLASSES_ROOT\CLSID の下に表示されましたが、今回はテスト スクリプトが同じプロンプトと標準の Windows コマンド プロンプトから機能しました (ただし、32 ビット プロンプトからは失敗します)。 )

しかし!!Excel 2007 (32 ビット) のアクティブ X コントロールが表示されない

ここで、使用している regasm を確認するために、Windows で *nix の「which」コマンドに相当するものを把握する必要があります)「where」コマンド

VS2010 と Windows 7 のコマンド プロンプトを見ると、次のようになります。

    VS2010 (standard prompt): cscript => c:\windows\system32\cscript.exe
                              regasm  => c:\windows\Microsoft.net\framework\v4.0.30319\regasm.exe

    VS2010 (x64 Win 64):      cscript => c:\windows\system32\cscript
                              regasm  => c:\windows\Microsoft.net\framework64\v4.0.30319\regasm.exe

    Windows 7  std. prompt:   cscript => c:\windows\system32\cscript.exe

    Windows 7 32 bit prompt:  cscript => c:\windows\SysWOW64\cscript.exe

これはすべて、私の混乱の一部を理解できるようにし始めています。私は無意識のうちに 32 ビット システムと 64 ビット システムを組み合わせて使用​​してきましたが、VS2010 標準のプロンプトも役に立ちませんでした。

(そして私の最新のピーブ-VS2010はファイルをBOM付きのUTF-8として保存します)

4

1 に答える 1

1

次のようにして、IEとvbscriptの両方でこれを機能させることができました。

  1. 「ActiveXTest」という名前の .NET クラス ライブラリを作成します。
  2. 次のように定義されている MyObject という名前のクラスを追加します。

    namespace ActiveXTest
    {
        [System.Runtime.InteropServices.ComVisible(true)]
        [System.Runtime.InteropServices.ProgId("ActiveXTest.MyObject")]
        [System.Runtime.InteropServices.Guid("df2dac4d-ba8a-4ecc-b76e-958c1bc32f1f")]
        public class MyObject
        {
            public string HelloWorld()
            {
                return "This is Hello World from the COM component!";
            }
        }
    }
    
  3. クラスをコンパイルします。クラスをコンパイルしたフォルダーに移動し、Visual Studio コマンド プロンプトから次の操作を行います。 regasm /codebase ActiveXTest.dll

  4. .vbs スクリプトからテストするには、メモ帳でファイルを作成し、test.vbs を呼び出します。ファイルに次のように入力します。

    Dim myObject
    set myObject = CreateObject("ActiveXTest.MyObject")
    MsgBox(myObject.HelloWorld)
    

コマンド プロンプトを開き、Test.vbs を作成した場所に移動して、wscript test.vbs と入力します。「これは COM コンポーネントからの Hellow World です」というダイアログが表示されます。

  1. これを IE からテストするために、次の内容の TEST.HTML ファイルを作成しました。

    <HTML>
        <HEAD>
            <script language="JScript" language="JavaScript">
              var obj = new ActiveXObject("ActiveXTest.MyObject");
              alert(obj.HelloWorld());          
            </script>
        </HEAD>
    
       <body>
           <span>nothing to see here!</span>
       <body>
    </HTML>
    

IE で TEST.HTML ファイルを開きます。ActiveX コントロールに関する警告が表示されます。対話を許可するには、[はい] と言うだけです。「これは COM コンポーネントからの Hello World です」という警告ダイアログが表示されます。

同様の手順を使用して、.js ファイルまたは Excel VBA から機能させることができます。ActiveX アセンブリの COM メソッド シグネチャを変更する場合は、再登録する必要があると思います。

于 2012-08-07T01:55:52.220 に答える