Я несколько дней пытался заставить простую DLL-библиотеку ActiveX работать безуспешно, несмотря на изучение нескольких статей на эту тему, которые я нашел в Интернете.
Я подозреваю, что имеюнекоторые вещи закодированы неправильно, так как я просто не знаком с этим, и большинство статей на эту тему устарели.Я использую Visual Studio 2008 и использую Windows SDK v7.1 для цифровой подписи.
Я пытаюсь вернуть клиентское имя машины изкласс среды возвращается на веб-страницу (и в конечном итоге обратно на веб-сервер).
Это мой класс 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>
В любом случае, это был кошмар, пытаясь собрать воедино все детали этого. Я был бы очень признателен за любую помощь в решении этого вопроса.
OK, Код проекта статья Полное учебное руководство по веб-элементам управления ActiveX с использованием сценариев с использованием 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» в Trusted Root Certs:
signtool verify /v /a GetClientInfoAX.cab
Обратите внимание, что я скопировалмоя DLL в моей папке Windows SDK, подписала это, скопировала его обратно в мой файл cab
, который я затем скопировал в мой файл SDK, подписала файл cab
.Затем, наконец, я скопировал файл cab
в свой проект веб-сайта.
ПРИМЕЧАНИЕ. См. Комментарии в конце первого ответа.Я приобрел подписанный сертификат у Comodo и, установив его, теперь получаю сообщение об ошибке «Неизвестный издатель», даже если статус сертификата «ОК».И DLL, и CAB-файл были подписаны.
Я считаю, что моя проблема сейчас заключается в том, что элемент управления должен быть помечен как безопасный для сценариев.Я нашел недавнюю статью, Создание элемента управления ActiveX в .NET с использованием C # , которая выглядит очень полезной.