オンラインで見つけたこのテーマに関するいくつかの記事を調べたにもかかわらず、単純な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 ファイルにコピーしてファイルに署名したことに注意してくださいcab
。cab
最後に、ファイルを Web サイト プロジェクトにコピーしました。
注:最初の回答の最後にあるコメントを参照してください。Comodoから署名付き証明書を購入し、それをインストールすると、証明書のステータスが「OK」であっても「不明な発行元」エラーが発生します。DLL ファイルと CAB ファイルの両方が署名されています。
私の問題は、コントロールをスクリプトに対して安全であるとマークする必要があることだと思います。最近の記事、C# を使用して .NET で ActiveX コントロールを作成するを見つけました。これは非常に役に立ちます。