1

オンラインで見つけたこのテーマに関するいくつかの記事を調べたにもかかわらず、単純なActiveX DLL を動作させるために何日も苦労してきました。

私はこれに慣れておらず、この件に関する記事のほとんどが古くなっているため、いくつかのコードが間違っていると思われます。Visual Studio 2008を使用しており、デジタル署名にはWindows SDK v7.1 を使用しています。

私がやろうとしているのは、クライアントの machineName を環境クラスから Web ページに戻す (そして最終的には Web サーバーに戻す) ことです。

これは私のC#クラスです:

using System;
using System.Reflection;
using System.Runtime.InteropServices;
using System.ComponentModel;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using Microsoft.Win32;

namespace GetClientInfo101
{
    [Guid("121C3E0E-DC6E-45dc-952B-A6617F0FAA32")]
    [InterfaceType(ComInterfaceType.InterfaceIsDual)]
    [ComVisible(true)]
    public interface IGetClient
    {
        [DispId(1)]
        string GetClient();
    }
    [Guid("5085C918-0236-4828-BDFA-063FEE57C69B")]
    [ProgId("getClientInfoAx.CGetClient")]
    [ClassInterface(ClassInterfaceType.None)]
    [ComDefaultInterface(typeof(IGetClient))]
    [System.ComponentModel.ToolboxItem(true)]
    [ComVisible(true)]
    public class CGetClient : IGetClient
    {
        public string GetClient()
        {
           return Environment.MachineName;
        }
    }
}

これが私のアセンブリです:

using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;

// General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("GetClientInfo101")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("GetClientInfo101")]
[assembly: AssemblyCopyright("Copyright © N/A 2010")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]

// Setting ComVisible to false makes the types in this assembly not visible
// to COM components.  If you need to access a type in this assembly from
// COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(false)]

// The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("1bf2a0bc-f9cb-4f68-8990-5caaf3ab525d")]

// Version information for an assembly consists of the following four values:
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")

これが私の Web サイトのマスター ページのオブジェクト タグとスクリプトです。**注: エラーが表示されます

Microsoft JScript ランタイム エラー: オートメーション サーバーはオブジェクトを作成できません

「var」実行時**:

<object id="getClientInfo" name="GetClientInfo101" classid="clsid:5085C918-0236-4828-BDFA-063FEE57C69B"
        codebase="GetClientInfo/GetClientInfoAX.cab#version=1,0,0,0">
</object>

<script type="text/javascript">
    function OpenActiveX()
    {
        var objGetClientInfo = new ActiveXObject("GetClientInfoAx.CGetClient");
        if(objGetClientInfo != null)
         {
             //For testing only
             alert(objGetClientInfo.GetClient());
         }
     }
</script>

次に、次のように .inf ファイルを手動で作成しました。

[version]
    signature="$CHICAGO$"
    AdvancedINF=2.0
[Add.Code]
    GetClientInfo101.dll=GetClientInfo101.dll
    GetClientInfo101.inf=GetClientInfo101.inf
[GetClientInfo101.dll]
    file-win32-x86=thiscab
    clsid={5085C918-0236-4828-BDFA-063FEE57C69B}
    FileVersion=1,0,0,0
    RegisterServer=yes
[GetClientInfo101.inf]
    file=thiscab

ただし、ファイルをビルドすると、次のようにファイル出力.cabも得られます (同じファイルにaと aファイルの両方が存在することを懸念しています。それは正しいですか?また、問題が発生するのでしょうか?どうすればよいかわかりませんファイルをビルドしないように Visual Studio に指示します。.OSD.cab.inf.OSD.cab.OSD

<?XML version="1.0" ENCODING='UTF-8'?>
<!DOCTYPE SOFTPKG SYSTEM "http://www.microsoft.com/standards/osd/osd.dtd">
<?XML::namespace href="http://www.microsoft.com/standards/osd/msicd.dtd" as="MSICD"?>
<SOFTPKG NAME="GetClientInfoAX" VERSION="1,0,0,0">
    <TITLE> GetClientInfoAX </TITLE>
    <MSICD::NATIVECODE>
        <CODE NAME="GetClientInfo101">
            <IMPLEMENTATION>
                <CODEBASE FILENAME="GetClientInfo101.dll">
                </CODEBASE>
            </IMPLEMENTATION>
        </CODE>
    </MSICD::NATIVECODE>
</SOFTPKG>

とにかく、これはすべての詳細をまとめようとする悪夢でした. これを解決するための助けにとても感謝しています。

わかりました。The Code Projectの記事A Complete Scriptable ActiveX Web Control Tutorial Using ATL.cabは、ファイルに署名するためのガイドとして使用したものです。「cab ファイルへの署名」というタイトルのセクションを参照してください。

ここに私が使用したコマンドがあります。CABARC の代わりに Visual Studio を使用して cab ファイルを作成したことに注意してください。また、テスト証明書のみを使用していることにも注意してください。

makecert -sv "getclientinfocert.pvk" -n "CN=My Company" getclientinfocert.cer

cert2spc getclientinfocert.cer getclientinfocert.spc

pvk2pfx -pvk getclientinfocert.pvk -pi AOTC20467cert -spc getclientinfocert.spc -pfx getclientinfocert.pfx -po AOTC81396pass –f

signtool sign /f getclientinfocert.pfx /p AOTC81396pass /t http://timestamp.verisign.com/scripts/timstamp.dll /v GetClientInfo101.dll

signtool sign /f getclientinfocert.pfx /p AOTC81396pass /t http://timestamp.verisign.com/scripts/timstamp.dll /v GetClientInfoAX.cab

certmgr「ルート エージェンシー」証明書を信頼されたルート証明書にエクスポートおよびインポートするために使用します。

signtool verify /v /a GetClientInfoAX.cab

DLL を Windows SDK フォルダーにコピーして署名し、それをcabファイルにコピーしてから、SDK ファイルにコピーしてファイルに署名したことに注意してくださいcabcab最後に、ファイルを Web サイト プロジェクトにコピーしました。

注:最初の回答の最後にあるコメントを参照してください。Comodoから署名付き証明書を購入し、それをインストールすると、証明書のステータスが「OK」であっても「不明な発行元」エラーが発生します。DLL ファイルと CAB ファイルの両方が署名されています。

私の問題は、コントロールをスクリプトに対して安全であるとマークする必要があることだと思います。最近の記事、C# を使用して .NET で ActiveX コントロールを作成するを見つけました。これは非常に役に立ちます。

4

1 に答える 1

0

ComVisiblecoクラスのバージョンに依存しないprogidは次のように設定されます

  [ProgId("getClientInfoAx.CGetClient")] 

一方、JScriptコードでは、インスタンス化コードは次のようになります。

  var objGetClientInfo = new ActiveXObject("GetClientInfoAx.CGetClient");

最初に大文字と小文字を区別して動作を確認してください。

于 2010-10-11T15:32:33.943 に答える