Пишу на С# dll:
using System;
using System.Reflection;
namespace Library
{
public delegate void MyEventHandler();
public interface ITest
{
event MyEventHandler Click;
int X();
}
public class TestComponent : ITest
{
public event MyEventHandler Click;
public int X()
{
if (Click != null)
Click();
return 100;
}
}
}
Делаю из всего этого COM-объект. И потом пытаюсь его использовать в С++:
#include <windows.h>
#include <iostream>
#include <comdef.h>
#import "Library.tlb" raw_interfaces_only
using namespace Library;
int main()
{
if (FAILED(CoInitialize(NULL))) return 0;
_bstr_t bstrCLSID = "Library.TestComponent";
CLSID clsidTest;
ITest* pITest;
if (FAILED(CLSIDFromProgID (bstrCLSID,&clsidTest))) return 0;
if (FAILED(CoCreateInstance(clsidTest, 0, CLSCTX_ALL, __uuidof(ITest), (void**)&pITest))) return 0;
pITest->add_Click(...);
long i;
pITest->X(&i);
pITest->remove_Click(...);
std::cout << i << std::endl;
pITest->Release();
CoUninitialize();
return 0;
}
Так вот вопрос: что нужно передавать в функциях add_Click(...) и remove_Click(...)?
Здравствуйте VladD2, Вы писали:
VD>Ты о чем? Тебе к событиям (по COM-овски) подключиться нужно.
Да. Есть мысль (а лучше код

) как это сделать?
Здравствуйте Mishka, Вы писали:
VD>>Ты о чем? Тебе к событиям (по COM-овски) подключиться нужно.
M>Да. Есть мысль (а лучше код
) как это сделать?
Так вроде MFC позволяет это даже визуально делать.
Хотя мысль сделать интеграцию на MC++ тоже не плохая.
Здравствуйте VladD2, Вы писали:
VD>Здравствуйте Mishka, Вы писали:
VD>>>Ты о чем? Тебе к событиям (по COM-овски) подключиться нужно.
M>>Да. Есть мысль (а лучше код
) как это сделать?
VD>Так вроде MFC позволяет это даже визуально делать.
Так вроде как они новую идеологию с событиями придумали (не через коннекшн поинты)...
Здравствуйте, Mishka, Вы писали:
M>Так вот вопрос: что нужно передавать в функциях add_Click(...) и remove_Click(...)?
Я для этого использовал ConnectionPoint.
CComPtr<IConnectionPointContainer> spCPC;
hr = m_varUnwrappedObject.pdispVal->QueryInterface(IID_IConnectionPointContainer, (LPVOID*)&spCPC);
if (!FAILED(hr))
{
CComPtr<IConnectionPoint> spCP;
hr = spCPC->FindConnectionPoint( IID_IEosNetEvents , &spCP);
DWORD dwCookie = 0;
if (!FAILED(hr))
{
CComPtr<IUnknown> resiver;
::CoCreateInstance(__uuidof(CNetUCEventsResiver) , NULL, CLSCTX_SERVER | CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**) &resiver);
hr = spCP->Advise(resiver, &dwCookie);
}
}