COM: как указать конкретный тип COM-объекта в качестве аргумента в idl - PullRequest
0 голосов
/ 17 февраля 2012

В настоящее время у меня есть код, который выглядит следующим образом

void calc_run(Calculation *c, Input *i);

STDMETHODIMP CCalculation::run(IUnknown* input)
{
    calc_run(calc,((CMyInputClass*)input)->get_input());  
    return S_OK;
}

Другими словами CCalculation::run хочет указатель на CMyInputClass, но в настоящее время требуется IUnknown и downcasts.

Предположительно, это плохо.

Но как я могу более точно указать COM, какой объект я хочу? Я попытался изменить файлы .c, .h и .idl, но компилятор не распознает CMyInputClass* как спецификацию типа в idl.

interface ICalculation : IDispatch{
[id(2), helpstring("method run")] HRESULT run([in] CMyInputClass* input);

Как правильно это сделать?

1 Ответ

2 голосов
/ 17 февраля 2012

COM-способ - это ввести COM-интерфейс, который CMyInputClass будет реализовывать и использовать этот интерфейс в объявлении run():

interface ICalculationInput : IUnknown {
     //some methods here
};

interface ICalculation : IDispatch{
     [id(2), helpstring("method run")] HRESULT run([in] ICalculationInput* input);
};
...