Как построить объект ActiveX в C ++, который может быть написан с помощью JavaScript - PullRequest
0 голосов
/ 07 ноября 2008

Я могу использовать шаблон MFC / ActiveX VS08 для создания объекта C ++ ActiveX, который я могу загрузить на страницу HTML и сценарий с Javascript Но я не могу понять, как создать интерфейс, который позволит мне вызывать пользовательские методы в моем компоненте с помощью Javascript.

Не могли бы вы сказать мне, как это сделать? Я потратил более двух часов на Google без удачи.

Спасибо.

Ответы [ 3 ]

2 голосов
/ 07 ноября 2008

Я не очень знаком с оболочкой MFC ActiveX, но могу ответить на вопрос в общем смысле:

COM-объект с интерфейсом, который является производным от IDispatch, может вызываться через языки автоматизации (например, Javascript). Методы также должны быть «совместимыми с автоматизацией», что означает, что параметры могут быть преобразованы в тип VARIANT или явно имеют тип VARIANT. Обратите внимание, что для параметров ввода / вывода тип должен быть VARIANT *, чтобы автоматизация "подключения" работала.

Я не знаю, как сделать объект ActiveX доступным в клиентском скрипте (например: встроить его в страницу), но если он имеет единственный интерфейс, производный от IDispatch, это делает его доступным для вызова из Javascript (и других средств автоматизации языки). Я надеюсь, что это помогает ...

1 голос
/ 07 мая 2009

Если вы используете шаблон VS08 MFC ActiveX, вы можете увидеть такой фрагмент в файле .h вашего элемента управления (в объявлении класса он защищен):

afx_msg void AboutBox();

DECLARE_DISPATCH_MAP()

И такой в ​​файле .cpp:

// Dispatch map

BEGIN_DISPATCH_MAP(CActiveXOutlookCtrl, COleControl)
    DISP_FUNCTION_ID(yourCtrl, "AboutBox", DISPID_ABOUTBOX, AboutBox, VT_EMPTY, VTS_NONE)
END_DISPATCH_MAP()

Мне никогда не приходилось использовать это, но это ваш диспетчерский интерфейс - то есть методы вашего объекта, которые могут вызывать другие. Что это значит:

  • "AboutBox" - это имя, которое они используют для его вызова.
  • DISPID_ABOUTBOX - это целочисленный идентификатор для функции (я думаю, что это произвольно. Я бы использовал положительное число, потому что по умолчанию берется много негативов).
  • AboutBox - имя метода.
  • VT_EMPTY - тип возвращаемого значения метода.
  • VTS_NONE - это тип параметров, которые он принимает.

Также есть DECLARE_MESSAGE_MAP () и DECLARE_EVENT_MAP (), что также может быть о том, что вы хотите.

1 голос
/ 19 ноября 2008

Это работает для встраивания вашего контейнера ActiveX в HTML-страницу и вызова метода:

<html> 
<body> 
<object height="0" width="0" id="myControl" classid="CLSID:AC12D6F8-AEB7-4935-B3C9-0E4FB6CF7FB1" type="application/x-oleobject">
</object>
<script>
    var activexObj = document.getElementById('myControl');
    if(activexObj != null)
    {
        var result = myControl.myMethod();
        document.write("Result: " + result + "<br/>");
    }
    else
    {
        document.write("ActiveX component not found!<br/>");
    }
</script>
</body>
</html>
...