尽管已经在网上找到了几篇关于这个主题的文章,但我一直在努力争取一个简单的ActiveX DLL工作,但没有成功。
我怀疑我有几件事情编码不正确,因为我对此并不熟悉,而且关于这个主题的大部分文章已经过时了。我正在使用Visual Studio 2008并一直使用Windows SDK v7.1进行数字签名。
我要做的是将客户端machineName从环境类返回到网页(最终返回到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")
这是我的网站母版页上的对象标记和脚本。 **注意:我收到错误
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
文件时,我还会向.OSD
收到.cab
个文件输出,如下所示(我担心同时存在.inf
和同一.OSD
文件中的.cab
文件。这是正确的,是否会导致问题?我不知道如何告诉Visual Studio不构建.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>
无论如何,这是一场噩梦,试图将所有细节拼凑在一起。我将非常感谢任何帮助解决这个问题。
好的,代码项目文章 A Complete Scriptable ActiveX Web Control Tutorial Using ATL 就是我用来签署.cab
文件的指南。请参阅“签署cab文件”一节。
以下是我使用的命令。请注意,我使用Visual Studio来创建cab文件而不是CABARC。另请注意,我只使用测试证书:
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
将“Root Agency”证书导出并导入受信任的根证书:
signtool verify /v /a GetClientInfoAX.cab
请注意,我将我的DLL复制到我的Windows SDK文件夹,签名,然后将其复制回我的cab
文件,然后将其复制到我的SDK文件,签署cab
文件。最后,我将cab
文件复制到我的网站项目中。
注意:请参阅第一个答案末尾的注释。我已经从Comodo购买了签名证书,并且已经安装了该证书,即使证书状态为“OK”,我现在也会收到“Unknown Publisher”错误。 DLL和CAB文件都已签名。
我认为我现在的问题是需要将控件标记为脚本安全。我发现了最近的一篇文章 Creating an ActiveX control in .NET using C# ,它看起来非常有用。
答案 0 :(得分:0)
ComVisible co类中与版本无关的progid设置为
[ProgId("getClientInfoAx.CGetClient")]
而在JScript代码中,实例化代码为
var objGetClientInfo = new ActiveXObject("GetClientInfoAx.CGetClient");
请先验证区分大小写并确认行为?