Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. [Solved] COM interface to CANoe
Qt 6.11 is out! See what's new in the release blog

[Solved] COM interface to CANoe

Scheduled Pinned Locked Moved General and Desktop
16 Posts 5 Posters 17.9k Views 2 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • N Offline
    N Offline
    NicuPopescu
    wrote on last edited by
    #7

    bq. How can I link to ole32.lib in Qt? I doesn’t find it on my PC. Only the ole32.dll….

    i.e. here is in C:\Program Files\Microsoft SDKs\Windows\v7.0A\Lib\
    better to copy it locally to your project in a "lib" folder and have in .pro file

    @LIBS += ../lib/ole32.lib@

    bq. What do you mean with the possible CoCreateInstance() results? Do you mean the error code saved in HRESULT result?

    yes

    L.E. I checked your initial code and it works ...

    1 Reply Last reply
    0
    • ? Offline
      ? Offline
      A Former User
      wrote on last edited by
      #8

      [quote author="NicuPopescu" date="1386863709"]i.e. here is in C:\Program Files\Microsoft SDKs\Windows\v7.0A\Lib\ better to copy it locally to your project in a "lib" folder and have in .pro file [/quote]

      I tried to add the library to my project:

      • I copied the Ole32.Lib out of the Microsoft SDK folder to my project directory

      • Then I added the following code to my pro file:

      @
      LIBS += C:/QtProject/3com_interface/libs/Ole32.Lib
      @

      But I get actually the same error:

      "undefined reference to '_GUID const& __mingw_uuidof<IApplication>()'

      Do I need some files more, for example the Ole32.dll?

      But I'm wondering that my code works correctly in your project. Could you post your code or your project so I can search for the differences?

      1 Reply Last reply
      0
      • ? Offline
        ? Offline
        A Former User
        wrote on last edited by
        #9

        Any ideas?

        I have still the same problem: How can I get the IID of a COM-Application to create the COM interface?

        There are two possibilities:

        1. Is there an alternative to __uuidof() to get the IID of the object?
        2. What do I need to add to my project, so I can use __uuidof() and how can I add this?

        Thank you for all answers so far!

        1 Reply Last reply
        0
        • N Offline
          N Offline
          NicuPopescu
          wrote on last edited by
          #10

          bq. Do I need some files more, for example the Ole32.dll?

          dll will be found in system32, so no worry

          I don't know why it is so difficult for you to get the project compiled; just in case I paste exactly what I have in main window project:

          .pro file:

          @#-------------------------------------------------

          Project created by QtCreator 2013-12-13T16:39:39

          #-------------------------------------------------

          QT += core gui

          greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

          TARGET = TestCANoeCOM
          TEMPLATE = app

          SOURCES += main.cpp
          mainwindow.cpp

          HEADERS += mainwindow.h

          FORMS += mainwindow.ui

          LIBS += ../TestCANoeCOM/lib/ole32.lib@

          path in LIBS depends on your projetc build directory in QtCreator's Projects panel

          in mainwindow.cpp

          @#include "mainwindow.h"
          #include "ui_mainwindow.h"
          #include <QDebug>

          #include "C:\Program Files\Vector CANoe 7.5\Exec32\COMdev\canoe.h"

          MainWindow::MainWindow(QWidget *parent) :
          QMainWindow(parent),
          ui(new Ui::MainWindow)
          {
          ui->setupUi(this);

          IApplication* pIApp;
          HRESULT result;
          
          result = CoInitialize(NULL);
          
          CLSID clsid;
          result = CLSIDFromProgID(L"CANoe.Application", &clsid);
          
          if(SUCCEEDED(result))
          {
              qDebug() << "CLSID saved";
          }
          
          const IID IID_IApplication = __uuidof(IApplication);
          
          result = CoCreateInstance(clsid, NULL, CLSCTX_LOCAL_SERVER, IID_IApplication, (void**) &pIApp);
          
          if(SUCCEEDED(result))
          {
              qDebug() << "Connection established";
          }
          

          }

          MainWindow::~MainWindow()
          {
          delete ui;
          }
          @

          nothing different to your first code ...

          bq. How can I get the IID of a COM-Application to create the COM interface?

          in registry HKEY_CLASSES_ROOT->PID (i.e CANoe.Application)->CLSID(Value)

          and in HKEY_CLASSES_ROOT->CLSID->Value(found above)->InprocServer32 , you can find more info on COM server registration like:
          LocalServer32=path to exe, ocx, dll into which your COM implementation resides

          hope it helps! :)

          1 Reply Last reply
          0
          • ? Offline
            ? Offline
            A Former User
            wrote on last edited by
            #11

            Hello NicuPopescu,

            I've found my mistake. Thank you for posting your code. You've helped me a lot!

            A 1 Reply Last reply
            0
            • N Offline
              N Offline
              NicuPopescu
              wrote on last edited by
              #12

              you're welcome! :)

              hope the answers help other fellows here ...

              1 Reply Last reply
              0
              • H Offline
                H Offline
                haythem
                wrote on last edited by
                #13

                HI

                1 Reply Last reply
                0
                • H Offline
                  H Offline
                  haythem
                  wrote on last edited by
                  #14
                  This post is deleted!
                  1 Reply Last reply
                  0
                  • ? Offline
                    ? Offline
                    A Former User
                    wrote on last edited by VRonin
                    #15

                    I want to call a function from QT application in facet this function exist a CAPL script runing in Canalyzer I am using COM to get access to the function here my exemple but it doesnt work where is the problem any help plz

                    this my code:

                    ICAPL *pcapl;
                    
                    ICAPLFunction *fn ;
                     IApplication* pIApp;
                    
                    
                    HRESULT result,result1,result2, hresult,result3,result4,hr;
                     IDispatch*CaplDisp,*CaplFn;
                    WCHAR * szMember = L"Multiply";
                     DISPID dispid;
                      DISPPARAMS dispparams = {NULL, NULL, 0, 0};
                        EXCEPINFO excepinfo;
                          UINT nArgErr;
                       CLSID clsid;
                    
                    
                    
                     result = CLSIDFromProgID(L"CANalyzer.Application", &clsid);
                       const  IID IID_CAPL =__uuidof(ICAPL);
                    
                        const  IID IID_CAPLFUNCTION =__uuidof(ICAPLFunction);
                         const IID IID_IApplication =__uuidof(IApplication);
                    
                       result = CoCreateInstance(clsid, NULL, CLSCTX_LOCAL_SERVER, IID_IApplication, (void**) &pIApp);
                    
                    
                       result1=pIApp->get_CAPL(&CaplDisp);
                    
                                   qDebug() << "Result_get_CAPL "<<result1 ;
                    
                    
                       result2=CaplDisp->QueryInterface(IID_CAPL,(void**)&pcapl);
                        qDebug() << "result2 "<<result2 ;
                    
                    
                      VARIANT varResult;
                    
                    
                      hr = CaplDisp->GetIDsOfNames(IID_CAPLFUNCTION, &szMember, 1, CLSCTX_LOCAL_SERVER, &dispid);
                        qDebug() << "hr"<<hr ;
                        if (SUCCEEDED(hr)) {
                    hr = CaplDisp->Invoke(1,IID_CAPL, CLSCTX_LOCAL_SERVER,DISPATCH_METHOD,&dispparams, &varResult, NULL, NULL);
                        }
                    
                    1 Reply Last reply
                    0
                    • ? A Former User

                      Hello NicuPopescu,

                      I've found my mistake. Thank you for posting your code. You've helped me a lot!

                      A Offline
                      A Offline
                      Anis07
                      wrote on last edited by Anis07
                      #16

                      @la-ga
                      hi can you tell us what was the problem ?

                      1 Reply Last reply
                      0

                      • Login

                      • Login or register to search.
                      • First post
                        Last post
                      0
                      • Categories
                      • Recent
                      • Tags
                      • Popular
                      • Users
                      • Groups
                      • Search
                      • Get Qt
                      • Unsolved