Ошибка 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, я верю, что вам нужно будет перерегистрировать ее.