Как получить доступ к подобъекту в интерфейсе CANoe COM Server - PullRequest
3 голосов
/ 26 ноября 2011

У меня есть одна большая и трудная для понимания проблема с COM-сервером.Я пытаюсь написать клиентское приложение к CANoe (приложение от Vector).Они дали файлы CANoe.tlb, CANoe.h и CANoe_i.cpp, но я использую только CANoe.tlb через #import.Все примеры в Visual Basic, и я пытаюсь написать это на VC ++ (консольное приложение).Проблема с наследованием.Т.е. в справке они написали, что основным объектом является приложение и доступ ко всем методам, событиям объекта и т. Д. Возможен только через этот объект.Все примеры в Visual Basic также просты:

Dim gCanApp As CANalyzer.Application
Set gCanApp = New Application
gCanApp.Open ("C:\Program Files\CANalyzer\Demo_CL\motbus.cfg")
gCanApp.CAPL.Compile
gCanApp.Measurement.Start

Я уверен, что я делаю ошибку, но я не знаю, где.Проще говоря, у меня нет доступа к подобъектам, их методам и т. Д. У меня есть доступ только к методам приложения.Например, я хотел бы вызвать метод Start from Measurement следующим образом: pApp-> Measurement-> Start (), но это невозможно.

Мой исходный код:

#import "CANoe.tlb" //importing CANoe type library
#include "stdafx.h"
#include <atlbase.h> //COM Server methods
#include <iostream>

using namespace CANoe;
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
    /*This part is working perfectly: */
    CComPtr<IApplication> pApp = NULL;
    CComPtr<IMeasurement> measure = NULL;
    CComPtr<ICAPL> capl = NULL;
    CLSID clsid;
    IID iid;
    HRESULT result;

    /* Initialization COM library: */
    if (FAILED(CoInitialize(NULL))) 
    {
        cerr << "Initialization COM Library error" << endl;
        system("pause");
        return 1;
    }
    if((result = CLSIDFromProgID(L"CANoe.Application", &clsid)) != S_OK) 
    {
        cerr << "Problem with opening application" << endl;
        system("pause");
        return 2;
    }
    result = pApp.CoCreateInstance(clsid);  //Opening CANoe Application
    if(result != S_OK)
                cout << "pApp fault" << endl;

    pApp->Open(L"C:\\test\\test.cfg", FALSE, TRUE); //Opening test.cfg file
    /****************End of good part**********************/

    //pApp->Measurement->Start();//I'd like to use it in this way - compiler error: error C2039: 'Start' : is not a member of 'IDispatch'

    pApp->get_Measurement((IDispatch**)&measure);
    measure->Start();//Unhandled exception at 0x7711d78c in canoe.exe: 0xC0000005: Access violation writing location 0x7711d78c.
    CoUninitialize(); //Uninitialization COM Library
}

Я прилагаю файлы CANoe COM-сервера (это законно из бесплатной демо-версии): http://www.sendspace.com/file/5pgcou

PS Использование COM-сервера является новым для меня, так что извините за возможно глупую ошибку.Я искал любую полезную информацию, но не нашел ничего об использовании этого COM-интерфейса.

1 Ответ

2 голосов
/ 26 ноября 2011

Попробуйте изменить свой код:

CComQIPtr<IMeasurement> measure;
CComPtr<IDispatch> measureDisp;

pApp->get_Measurement(&measureDisp);
measure = measureDisp;
measure->Start();

Также не забудьте проверить результаты вызванных методов.

...