2010-08-16 3 views
5

Я изучаю, как писать скриптовый элемент управления ActiveX. Моя цель - иметь крошечный элемент управления, который может проверить, установлено ли что-то в системе. Что я сделал до сих пор:Написание простого элемента управления ActiveX для IE с одним методом

  • Создать проект управления MFC ActiveX в VS2008
  • Добавить некоторые «безопасные для сценариев» биты, которые я нашел here.
  • Расширьте IDL, чтобы предоставить мой метод «IsInstalled», который теперь безоговорочно возвращает TRUE (но позже будет читать некоторые ключи из реестра.)
  • Создайте элемент управления и запустите regsvr32 на нем. Я подтвердил, что он отображается в HKEY_CLASSES_ROOT, и когда я создаю экземпляр объекта, панель «Локали» в IE Developer Tools показывает, что объект имеет тип _D [мое имя плагина]. Не только это, но мой метод IsInstalled() появляется под этим объектом.

Однако, когда я называю IsInstalled(), я просто не могу заставить его работать:

JScript Debugger - Breaking on JScript runtime error -(n http://img138.imageshack.us/img138/1586/whycomwhy.png

Я в недоумении. Я также попытался сделать IsInstalled свойство вместо метода, используя VARIANT_BOOL вместо boolean вместо BOOL в IDL, вы назовете его.

Вот соответствующие выдержки из кода.

Заголовок:

afx_msg VARIANT_BOOL IsInstalled(); 

Реализация:

afx_msg VARIANT_BOOL 
CMyAXCtrl::IsInstalled() 
{ 
    return TRUE; 
} 

Отправка карта:

BEGIN_DISPATCH_MAP(CMyAXCtrl, COleControl) 
    DISP_FUNCTION_ID(CMyAXCtrl, "IsInstalled", dispidIsInstalled, IsInstalled, VT_BOOL, VTS_NONE) 
END_DISPATCH_MAP() 

Отправка часть IDL:

[ uuid(6B662202-CF13-4144-AA33-C3FEE9C2C962), 
     helpstring("Dispatch interface for My Control")] 
    dispinterface _Daxplugin 
    { 
    properties: 
    methods: 
     [id(1)] VARIANT_BOOL IsInstalled(); 
    }; 

Если есть какие-либо другие соответствующие биты кода, которые я должен предоставить, сообщите мне. Но я здесь. Заранее спасибо!

+0

Какая ошибка выполнения JScript, которую вы получаете? Ваша картинка просто показывает «(n», что не очень полезно. –

+0

Это именно то, что есть. Я не могу понять, как показать полную ошибку времени выполнения. В любом случае, см. Мой комментарий ниже - это своего рода спорный вопрос теперь –

ответ

3

У вас почти наверняка есть неправильный прототип для функции, доступной для сценариев. OLE Automation для языков сценариев имеет тенденцию полагаться на возвращение HRESULT, а затем используя параметр out для фактического кода возврата.

Так измените его на [id(1)] HRESULT IsInstalled(VARIANT_BOOL* p);

Также ИСТИНА! = VARIANT_TRUE, вы должны вернуть VARIANT_TRUE, который равен -1 вместо 1.

Надежда некоторые, что на самом деле помогает, но без фактической ошибки Возможно, я ошибаюсь :)

+0

Я закончил переписывание всего в ATL, который имеет более четкий интерфейс для внедряя безопасные для скриптов биты, и я обнаружил эту проблему HRESULT самостоятельно. Однако по этой причине я не уверен, что я действительно хочу присудить награду, так как я это выяснил на своем o шп. Спасибо, в любом случае. –

0

Вы можете отметить свой контроль как сохранение сценариев путем реализации IObjectSafety или путем маркировки объекта как сохранения при его регистрации (как предполагалось по предоставленной вами ссылке).

Вы запустили regsvr32 после добавления кода для его сохранения, кроме скриптов?

Вы можете проверить реестр, если ваш элемент управления имеет сейф для набора битов скриптов. Если бит установлен, вы найдете два ключа {7DD95802-9882-11CF-9FA9-00AA006C42C4} (Safe for Initialization) {7DD95801-9882-11CF-9FA9-00AA006C42C4}(Safe For Scripting) как подразделы реализованных категорий в вашем объекте.

Я бы предложил реализовать IObjectSafety, так как он не зависит от вашего класса для регистрации.

+0

Я использовал пример проекта из CodeProject, который включает ручную регистрацию этих двух CLSID. Безопасность в сценариях не является проблемой, или я бы не смог создать экземпляр объекта вообще. Проблема возникает позже. –

+0

Если я правильно понял документацию, IE создаст элемент управления ActiveX, но не разрешит доступ к скриптам, если он не найдет атрибуты Safe For Scripting. –

Смежные вопросы