2

J'ai un gros problème difficile à comprendre avec COM Server. J'essaye d'écrire l'application de client à CANoe (application par le vecteur). Ils ont donné des fichiers CANoe.tlb, CANoe.h et CANoe_i.cpp mais je n'utilise que CANoe.tlb via # import. Tous les exemples sont en Visual Basic et j'essaye de l'écrire dans VC++ (application console). Le problème est avec l'héritage. C'est à dire. dans l'aide qu'ils ont écrit, cet objet principal est Application et l'accès à toutes les méthodes, les événements d'objet, etc. est possible uniquement via cet objet. Tous les exemples dans Visual Basic sont également simples, à savoir:Comment accéder au sous-objet dans l'interface du serveur COM Canoe

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 

Je suis sûr que je fais une erreur mais je n'ai aucune idée d'où. En termes simples, je n'ai pas accès aux sous-objets, à leurs méthodes, etc. Je n'ai accès qu'aux méthodes de l'application. Par exemple, je voudrais appeler la méthode Start from Measurement de la façon suivante: pApp-> Measurement-> Start() mais c'est impossible.

Mon code source:

#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 
} 

Je CANoe attaché COM fichiers du serveur (il est légal de la version de démonstration gratuite): http://www.sendspace.com/file/5pgcou

P.S. Utilisation de COM Server est nouveau pour moi, donc désolé pour une erreur finalement stupide. Je cherchais des informations utiles mais je n'ai rien trouvé sur l'utilisation de cette interface COM.

+0

Je ne crois pas que personne ne peut m'aider :( – meler

+0

Je ne peux pas compiler votre échantillon dans pApp-> Measurement-> Start(), parce que Measurement retrun IDisptach objet qui n'a pas Démarrer la méthode – Victor

+0

Vous avez raison. Le code a été modifié dans le premier article, il est maintenant compilable, donc vous pouvez peut-être proposer sth comment utiliser l'objet Measurement avec ses méthodes.J'ai ouvert CANoe.tlb avec OLE-COM Object Viewer mais ces informations ne sont pas faciles à comprendre pour moi. voir la solution pour utiliser un autre objet? Peut-être que j'utilise pApp-> GetMeasurement (IDispatch **) dans le mauvais sens.J'attache le fichier d'aide sur l'utilisation de CANoe COM Server: http://www.sendspace.com/file/7pqxyv – meler

Répondre

1

Essayez de changer votre code:

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

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

aussi ne pas oublier de vérifier les résultats des méthodes appelées.

+0

Ca marche parfaitement :) Merci beaucoup Victor !!! Je n'ai pas pensé à mixer CComQIPtr avec CComPtr :) – meler

+0

CComQIPtr appelle simplement QueryIterface et convertit IDispatch en objet IMeasurement. Dans COM vous ne pouvez pas utiliser static_cast pour le cast, vous devriez plutôt utiliser QueryInterface. – Victor

Questions connexes