Написание простого элемента управления ActiveX для IE, который имеет один метод - PullRequest
5 голосов
/ 16 августа 2010

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

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

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

JScript Debugger - Ошибка при взломе во время выполнения JScript - (n http://img138.imageshack.us/img138/1586/whycomwhy.png

Я в растерянности. Я также пытался сделать IsInstalled свойством вместо метода, используя VARIANT_BOOL вместо логического вместо 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();
   };

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

Ответы [ 2 ]

3 голосов
/ 23 августа 2010

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

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

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

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

0 голосов
/ 20 августа 2010

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

Запускали ли вы regsvr32 после добавления кода, чтобы пометить его для сохранения в сценариях?

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

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

...