Помогите с параметрами ActiveX event-а
От: Александр Воронин Россия [70620598]
Дата: 08.10.05 20:33
Оценка:
Здравствуйте!

Угораздило меня полезть в малознакомую мне тему — работа с COM на уровне C++/ATL/MFC. Потому как ни привычный Delphi, ни семейство .NET не пожелали работать с этим актив-иксом Delphi падает при вызове метода, нормально читая проперти, в .NET не приходят event-ы. Примеры есть на VB6 и на нем (точнее на VBA в excel) они работают.

Сделал тестовую программу на MFC с ConnectionPoints по статье
Автор(ы): Евгений Щербатов
Дата: 18.04.2001

Статья посвящена технологии Connection Points в программах на MFC. Автор кратко описывает сущность и назначение этой технологии, а затем демонстрирует создание COM-клиента и COM-сервера на базе MFC с её использованием.
. Работает, но не могу добраться до аргументов обработчикой событий Вопрос в том, как правильно описать функцию-обработчик и использовать в ней переданный параметр... Три дня поиска по сайту и msdn ситуацию не прояснили...

в VBA это выглядело так:
Private Sub on_Iam(ByVal service As BACNETLib.IIam)
'... использую ...
 Debug.Print service.network


В C++ сделал:
.h:
#import "../bacnet/bacnetx.dll" named_guids no_namespace

// ...

    DECLARE_DISPATCH_MAP()
    DECLARE_INTERFACE_MAP()

/* IDL:
    [
      odl,
      uuid(93F6D2DF-7002-11D5-A66F-0050DA883529),
      helpstring("IIam Interface"),
      dual,
      oleautomation
    ]
    interface IIam : IDispatch {

        [id(0x00000005), propget, helpstring("property network")]
        HRESULT network([out, retval] long* pVal);

// ...
struct __declspec(uuid("a4234400-6697-11d5-a66d-0050da883529"))
_IApplicationLayerEvents : IDispatch
{
    //
    // Wrapper methods for error-handling
    //

    // Methods:
    HRESULT Iam (
        struct IIam * service );
*/
    void OnBacnetIam(IIam *srv);


.cpp
BEGIN_DISPATCH_MAP(CBacnetDlg, CDialog)
    DISP_FUNCTION(CBacnetDlg, "Iam", OnBacnetIam, VT_EMPTY, VTS_DISPATCH)
END_DISPATCH_MAP()

BEGIN_INTERFACE_MAP(CBacnetDlg, CDialog)
    INTERFACE_PART(CBacnetDlg, DIID__IApplicationLayerEvents, Dispatch)
END_INTERFACE_MAP()

void CBacnetDlg::OnBacnetIam(IIam *srv)
{
  long x = srv->network;
  // тут падаем:( ... network - "long IIam::network"


В обработчик вроде бы нормально все передается, в Watches видно IDispatch и IUnknown "содержимое" Iam. При обращении к проперти — как правило "Неверное значение ESP — возможно неправильное соглашение о вызове" или First-chance exception и выход из метода/отладчика.
---
wbr, Alexander Voronin
mailto:
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.