Как создать объект ActiveX в C ++, который можно создать с помощью Javascript

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

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

Благодарю.

javascript,c++,com,interop,activex,

0

Ответов: 3


2 принят

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

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

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


1

Это работает для встраивания вашего контейнера 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>

1

Если вы используете шаблон VS08 MFC ActiveX, вы можете увидеть такой сниппет в файле .h 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 (), хотя это может быть и то, что вы хотите.

JavaScript, C ++, COM, Interop, ActiveX,
Похожие вопросы