Ошибка DLL ActiveX
ОК, в то время как я никогда не думал, что в 2012 году я бы написал свой первый элемент управления ActiveX (и да, для этого есть веская причина). Я борюсь за то, чтобы он запускался под Windows 7 (x64).
Краткая история решения: Я отсутствовал /codebase из некоторых своих вызовов regasm, а также смешивал 32 и 64-битные процессы, но этому не помогало стандартное смешение командной строки VS2010 32 и 64-разрядные пути для regasm и cscript.
Должна долгая история:
Я подпрыгивал между
Создание элемента управления ActiveX в .NET с помощью С#
( Упс У меня была неправильная ссылка.. хотя похоже, что ссылка, которую я изначально предоставил, была кем-то, копирующим исходную страницу блога)
Создание элемента управления ActiveX в .Net с использованием С#
и
Элемент управления С# ActiveX (CSActiveX)
И я, кажется, успешно строил проекты (для последней мне пришлось изменить расположение компилятора ресурсов в нужное место).
Для первого проекта я использую предложенный установщик, для второго проекта я пытаюсь использовать regasm напрямую.
Но после этого все идет вниз по склону. Я пытаюсь зарегистрировать все, кроме либо:
- Я понятия не имею, как я должен их регистрировать, или:
- Я понятия не имею, как я должен их регистрировать.
Мой тестовый пример был простым JScript файлом, содержащим
var x = new ActiveXObject( "name of object" );
Что не удается с ошибкой:
test.js(1,1) Ошибка выполнения Microsoft JScript: сервер автоматизации не может создавать объект
Я не уверен, что это проблема с разрешениями, или проблема с 32 или 64 бит или комбинация.
Многие сайты, предлагающие помощь в ActiveX, предполагают, что вы будете получать доступ к нему через веб-страницу, поэтому я попытался просмотреть разрешения IE (хотя я хочу загрузить элемент управления в программу из 3-й части).
Я знаю, что если я использую версии reg framework или framework64, я могу контролировать, где в записи реестра ставится - и я видел некоторые ссылки на запуск cscript как 32 или 64 бит (что может повлиять на какая часть реестра выполняется поиск) в зависимости от вызываемой оболочки cmd (и я пробовал оба способа, а также пытается создать "администратор" ).
Итак, в основном на этом этапе я понятия не имею, что я делаю или что я должен делать.
Моя цель - зарегистрировать элемент управления ActiveX в Windows 7 x64 и загрузить его с помощью:
- Тест .js script выполняется из командной строки по умолчанию Windows
- Загрузите тот же элемент управления в нечто вроде Excel 2007 VBA (только для тестирования)
- Загрузите элемент управления в приложение из третьей части (RSView Studio от Rockwell) и разместите его в приложении VBA (и мне нужно проверить, является ли это 32 или 64-битной программой. Я подозреваю, что это первый)
Примечания
Для проекта, в котором пользователи установщика (создание элемента ActiveX в .Net с использованием С#), он устанавливает код в "c:\program Files (x86) \" и ищет с regedit. Я нахожу записи в разделе "Компьютер\HKEY_CLASSES_ROOT\Wow6432Node\CLSID\", который, как мне кажется, говорит мне, что DLL была установлена как 32-битный процесс. Я попытался запустить мой тест cscript из 32-х и 64-х бит-cmd, и оба они терпят неудачу. Учтите, что установщик создавал эквивалент "regasm/codebase" при его запуске.
В проекте, где я пытался использовать regasm для его регистрации (С# ActiveX control (CSActiveX)), у него есть дополнительный код для регистрации элемента управления ActiveX COM. В этом коде упоминается регистрация 32-битных серверных процессов (см. ActiveXCtrlHelpers.cs)
(Кстати, я также проклинаю автоответчик в Safari/Lion на данный момент, продолжает менять строчную "DLL" в "все" )
Редактировать 2012-08-07
В ответ на ответ Art я обнаружил:
Из стандартной командной строки VS2010
При запуске 'regasm/codebase' через стандартную командную строку VS2010 (и как администратор, чтобы разрешить regasm выполнять изменения), записи были загружены в реестр под HKEY_CLASSES_ROOT\Wow6432Node\CLSID, а тестовые скрипты не сработали из того же приглашения.
Однако я могу видеть элемент управления ActiveX в Excel 2007 (32 бит)
Из командной строки x64 Win64 VS2010
При запуске в командной строке VS2010 x64 Win64 (опять же как admin) записи реестра появлялись под HKEY_CLASSES_ROOT\CLSID, но на этот раз тестовые скрипты работали из одного и того же приглашения, а также из стандартной командной строки Windows cmd (однако они не с 32-битная подсказка)
Но!! Я не вижу активного элемента управления X из Excel 2007 (32 бит)
Теперь мне просто нужно выяснить, что эквивалентно окну * nix ', который' команду для обеспечения того, какой regasm я использую) команда '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 тоже не помогло!
(и мой последний peeve - VS2010, сохраняющий файлы как UTF-8 с спецификацией)
Ответы
Ответ 1
Мне удалось выполнить эту работу как через IE, так и vbscript, выполнив следующие действия:
- Создайте библиотеку классов .NET с именем 'ActiveXTest'
-
Добавьте класс с именем 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!";
}
}
}
-
Скомпилируйте класс. Перейдите в папку, в которой вы скомпилировали класс, и выполните следующие действия из командной строки Visual Studio: regasm/codebase ActiveXTest.dll
-
Чтобы протестировать с .vbs script, создайте файл в блокноте test.vbs. введите в файл следующее:
Dim myObject
set myObject = CreateObject("ActiveXTest.MyObject")
MsgBox(myObject.HelloWorld)
Откройте командную строку и перейдите туда, где вы создали Test.vbs и введите: wscript test.vbs. Должно быть отображено диалоговое окно с надписью "This Hellow World от COM-компонента"
-
Чтобы проверить это из 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>
Откройте файл TEST.HTML в IE. Вы получите предупреждение об элементе управления ActiveX; просто скажите "Да", чтобы разрешить взаимодействие. Появится диалоговое окно с предупреждением "Это Hello World из COM-компонента".
Аналогичные шаги могут быть использованы для работы из файла .js или из Excel VBA. Обратите внимание: если вы измените подпись метода COM сборки ActiveX, я верю, что вам нужно будет перерегистрировать ее.