Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. How to call Registeration-Free COM dll?
QtWS25 Last Chance

How to call Registeration-Free COM dll?

Scheduled Pinned Locked Moved Solved General and Desktop
36 Posts 4 Posters 4.6k Views
  • 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.
  • B Bruce.Zhang
    13 Aug 2023, 03:15

    Hi guys, As the topic mentioned, how to call the registration-free COM DLLs from QT?

    In C# I see we can use the manifest files, so what if in QT?

    C Offline
    C Offline
    ChrisW67
    wrote on 13 Aug 2023, 10:42 last edited by ChrisW67
    #4

    @Bruce-Zhang As far as I can see: You use the manifest file to get the COM object into the application's execution context at start up (Windows does this for you). Then you can use the ActiveQt classes exactly the same way you would for a registered COM object.

    You would have to craft the manifest file and include it in your application binary though the Windows (not Qt) resource system. You may already have a Windows RC file if you have a included a range of application icons or some UAC escalation magic.

    You can see an example manifest file in an ancient Qt enhancement suggestion.

    H 1 Reply Last reply 13 Aug 2023, 11:54
    0
    • C ChrisW67
      13 Aug 2023, 10:42

      @Bruce-Zhang As far as I can see: You use the manifest file to get the COM object into the application's execution context at start up (Windows does this for you). Then you can use the ActiveQt classes exactly the same way you would for a registered COM object.

      You would have to craft the manifest file and include it in your application binary though the Windows (not Qt) resource system. You may already have a Windows RC file if you have a included a range of application icons or some UAC escalation magic.

      You can see an example manifest file in an ancient Qt enhancement suggestion.

      H Offline
      H Offline
      hskoglund
      wrote on 13 Aug 2023, 11:54 last edited by hskoglund
      #5

      @ChrisW67 said in How to call Registeration-Free COM dll?:

      @Bruce-Zhang As far as I can see: You use the manifest file to get the COM object into the application's execution context at start up (Windows does this for you). Then you can use the ActiveQt classes exactly the same way you would for a registered COM object.

      That's a great idea! One of QAxObject's constructors takes an IUnknown ptr so one way to do it would be to LoadLibrarying the dll, call DllGetClassObject() and CreateInstance() on the returned IClassFactory. Then construct a QAxObject from the IUnknown you got from CreateInstance() and Bob's your uncle.

      P.S. I don't think that code in that ancient QtBug suggestion actually works, it's more of "how it could be written" once ActiveQt starts supporting .manifest files...

      B 2 Replies Last reply 14 Aug 2023, 02:27
      0
      • H hskoglund
        13 Aug 2023, 11:54

        @ChrisW67 said in How to call Registeration-Free COM dll?:

        @Bruce-Zhang As far as I can see: You use the manifest file to get the COM object into the application's execution context at start up (Windows does this for you). Then you can use the ActiveQt classes exactly the same way you would for a registered COM object.

        That's a great idea! One of QAxObject's constructors takes an IUnknown ptr so one way to do it would be to LoadLibrarying the dll, call DllGetClassObject() and CreateInstance() on the returned IClassFactory. Then construct a QAxObject from the IUnknown you got from CreateInstance() and Bob's your uncle.

        P.S. I don't think that code in that ancient QtBug suggestion actually works, it's more of "how it could be written" once ActiveQt starts supporting .manifest files...

        B Offline
        B Offline
        Bruce.Zhang
        wrote on 14 Aug 2023, 02:27 last edited by
        #6

        @hskoglund @ChrisW67 @Christian-Ehrlicher
        Thanks for replies, I will have a try.

        1 Reply Last reply
        0
        • H hskoglund
          13 Aug 2023, 11:54

          @ChrisW67 said in How to call Registeration-Free COM dll?:

          @Bruce-Zhang As far as I can see: You use the manifest file to get the COM object into the application's execution context at start up (Windows does this for you). Then you can use the ActiveQt classes exactly the same way you would for a registered COM object.

          That's a great idea! One of QAxObject's constructors takes an IUnknown ptr so one way to do it would be to LoadLibrarying the dll, call DllGetClassObject() and CreateInstance() on the returned IClassFactory. Then construct a QAxObject from the IUnknown you got from CreateInstance() and Bob's your uncle.

          P.S. I don't think that code in that ancient QtBug suggestion actually works, it's more of "how it could be written" once ActiveQt starts supporting .manifest files...

          B Offline
          B Offline
          Bruce.Zhang
          wrote on 14 Aug 2023, 15:51 last edited by
          #7

          Thank you for responding, @hskoglund. Can you please provide a straightforward demonstration of this? I would greatly appreciate it.

          1 Reply Last reply
          0
          • H Offline
            H Offline
            hskoglund
            wrote on 15 Aug 2023, 03:09 last edited by
            #8

            Hi, here's a demo for you, first you need a COM dll to test on, I built the ActiveQt Wrapper Example using Qt 6.5.2 and MSVC 2019 64-bits (got an linker error when building so that regsvr32 failed, but it doesn't matter, it's not needed since we're working registry-free :-)

            Then create a console app (Untitled), I used the same Qt 6.5.2 and MSVC 2019 64-bits compiler. Note: I created the app with qmake (not CMake).
            Change untitled.pro to look like this:

            QT       = core axcontainer
            CONFIG  += c++17 cmdline
            SOURCES += main.cpp
            

            and change main.cpp to look like this:

            #include <QCoreApplication>
            
            #include "qaxobject.h"
            #include "quuid.h"
            #include "qlibrary.h"
            #include "qdebug.h"
            #include "atlbase.h"
            int main(int argc, char *argv[])
            {
                Q_UNUSED(argc) Q_UNUSED(argv)
            
            // load a COM flavored DLL without using the registry (here we use the Wrapper example)
                QLibrary regFreeLib("C:/Qt/Examples/Qt-6.5.2/activeqt/build-wrapper-Desktop_Qt_6_5_2_MSVC2019_64bit-Release/wrapperax.dll");
            
            // wire up the DllGetClassObject function so we can call it
                auto regFreeGetDllClassObject = reinterpret_cast<HRESULT (__stdcall *)(REFCLSID,REFIID,LPVOID*)> (regFreeLib.resolve("DllGetClassObject"));
                if (nullptr == regFreeGetDllClassObject)
                    qFatal("wiring up DLLGetClassObject() failed");
            
            // try to call it
                CComPtr<IClassFactory> pClassFactory;
                HRESULT hr = regFreeGetDllClassObject(QUuid("{6E795DE9-872D-43CF-A831-496EF9D86C68}"),IID_IClassFactory,(LPVOID*) &pClassFactory);
                if (FAILED(hr))
                    qFatal("calling DLLGetClassObject() failed");
            
            // and then obtain the IUnknown ptr
                CComPtr<IUnknown> pUnknown;
                hr = pClassFactory->CreateInstance(nullptr,IID_IUnknown,(LPVOID*) &pUnknown);
                if (FAILED(hr))
                    qFatal("createInstance() failed");
            
            // if we get this far Bob's your uncle, let Qt take it from here
                auto comObject = new QAxObject(pUnknown);
                if (nullptr == comObject)
                    qFatal("QAxObject creation failed");
            
            // as a test, fiddle with checked property of the QCheckBox
                comObject->setProperty("checked",true);
                qDebug() << comObject->property("checked");
                comObject->setProperty("checked",false);
                qDebug() << comObject->property("checked");
            }
            

            P.S. If you get a compiler error: "cannot find qaxobject.h" then you might have forgotten to add the "Active Qt" component to your Qt (can be found inside "Additional Libraries" in the Qt Maintainer).

            B 1 Reply Last reply 15 Aug 2023, 13:14
            1
            • H hskoglund
              15 Aug 2023, 03:09

              Hi, here's a demo for you, first you need a COM dll to test on, I built the ActiveQt Wrapper Example using Qt 6.5.2 and MSVC 2019 64-bits (got an linker error when building so that regsvr32 failed, but it doesn't matter, it's not needed since we're working registry-free :-)

              Then create a console app (Untitled), I used the same Qt 6.5.2 and MSVC 2019 64-bits compiler. Note: I created the app with qmake (not CMake).
              Change untitled.pro to look like this:

              QT       = core axcontainer
              CONFIG  += c++17 cmdline
              SOURCES += main.cpp
              

              and change main.cpp to look like this:

              #include <QCoreApplication>
              
              #include "qaxobject.h"
              #include "quuid.h"
              #include "qlibrary.h"
              #include "qdebug.h"
              #include "atlbase.h"
              int main(int argc, char *argv[])
              {
                  Q_UNUSED(argc) Q_UNUSED(argv)
              
              // load a COM flavored DLL without using the registry (here we use the Wrapper example)
                  QLibrary regFreeLib("C:/Qt/Examples/Qt-6.5.2/activeqt/build-wrapper-Desktop_Qt_6_5_2_MSVC2019_64bit-Release/wrapperax.dll");
              
              // wire up the DllGetClassObject function so we can call it
                  auto regFreeGetDllClassObject = reinterpret_cast<HRESULT (__stdcall *)(REFCLSID,REFIID,LPVOID*)> (regFreeLib.resolve("DllGetClassObject"));
                  if (nullptr == regFreeGetDllClassObject)
                      qFatal("wiring up DLLGetClassObject() failed");
              
              // try to call it
                  CComPtr<IClassFactory> pClassFactory;
                  HRESULT hr = regFreeGetDllClassObject(QUuid("{6E795DE9-872D-43CF-A831-496EF9D86C68}"),IID_IClassFactory,(LPVOID*) &pClassFactory);
                  if (FAILED(hr))
                      qFatal("calling DLLGetClassObject() failed");
              
              // and then obtain the IUnknown ptr
                  CComPtr<IUnknown> pUnknown;
                  hr = pClassFactory->CreateInstance(nullptr,IID_IUnknown,(LPVOID*) &pUnknown);
                  if (FAILED(hr))
                      qFatal("createInstance() failed");
              
              // if we get this far Bob's your uncle, let Qt take it from here
                  auto comObject = new QAxObject(pUnknown);
                  if (nullptr == comObject)
                      qFatal("QAxObject creation failed");
              
              // as a test, fiddle with checked property of the QCheckBox
                  comObject->setProperty("checked",true);
                  qDebug() << comObject->property("checked");
                  comObject->setProperty("checked",false);
                  qDebug() << comObject->property("checked");
              }
              

              P.S. If you get a compiler error: "cannot find qaxobject.h" then you might have forgotten to add the "Active Qt" component to your Qt (can be found inside "Additional Libraries" in the Qt Maintainer).

              B Offline
              B Offline
              Bruce.Zhang
              wrote on 15 Aug 2023, 13:14 last edited by
              #9

              @hskoglund Thanks very much.

              1 Reply Last reply
              0
              • H Offline
                H Offline
                hskoglund
                wrote on 15 Aug 2023, 21:03 last edited by
                #10

                Hi forgot to mention: how did I find that GUID QUuid("{6E795DE9-872D-43CF-A831-496EF9D86C68}")? It's from line 68 in main.cpp in the Wrapperax example, it's one of the 3 classIDs listed (you can use any one of the 3).

                For your dll, you need to find the relevant CLSID, in the manifest file look for the comclass line.
                For example, the manifest file shown in that ancient QtBug suggestion shows:

                ...
                <comClass clsid="{6BF52A52-394A-11D3-B153-00C04F79FAA6}" 
                ...
                

                If you want to use that and open the Windows Media Player dll (wmp.dll) instead, change my demo code above to:

                // load a COM flavored DLL without using the registry (here we use wmp.dll)
                    QLibrary regFreeLib("wmp.dll");
                
                // wire up the DllGetClassObject function so we can call it
                    auto regFreeGetDllClassObject = reinterpret_cast<HRESULT (__stdcall *)(REFCLSID,REFIID,LPVOID*)> (regFreeLib.resolve("DllGetClassObject"));
                    if (nullptr == regFreeGetDllClassObject)
                        qFatal("wiring up DLLGetClassObject() failed");
                
                // try to open the Windows Media Player:
                    CComPtr<IClassFactory> pClassFactory;
                    HRESULT hr = regFreeGetDllClassObject(QUuid("{6BF52A52-394A-11D3-B153-00C04F79FAA6}"),IID_IClassFactory,(LPVOID*) &pClassFactory);
                    if (FAILED(hr))
                        qFatal("calling DLLGetClassObject() failed");
                

                To check that you managed to open the dll correctly, one way is to add a call generateDocumentation at the end, like this:

                ,,,
                
                // if we get this far we're in business, let Qt take it from here
                    auto comObject = new QAxObject(pUnknown);
                    if (nullptr == comObject)
                        qFatal("QAxObject creation failed");
                
                // check that we have something live
                    qDebug() << comObject->generateDocumentation();
                

                the output (if it works) should have some HTML code (save it to a HTML file to view it properly).

                Finally, you need to match the bitness of your dll (it it's 32-bits you need to compile a 32-bits Qt app and the other way around). Normally the COM infrastructure allows 32-bit/64-bit crossplaying by loading the .dll out-of-process, but since you're doing LoadLbrary() you are closer to the metal.

                B 1 Reply Last reply 16 Aug 2023, 07:05
                0
                • H hskoglund
                  15 Aug 2023, 21:03

                  Hi forgot to mention: how did I find that GUID QUuid("{6E795DE9-872D-43CF-A831-496EF9D86C68}")? It's from line 68 in main.cpp in the Wrapperax example, it's one of the 3 classIDs listed (you can use any one of the 3).

                  For your dll, you need to find the relevant CLSID, in the manifest file look for the comclass line.
                  For example, the manifest file shown in that ancient QtBug suggestion shows:

                  ...
                  <comClass clsid="{6BF52A52-394A-11D3-B153-00C04F79FAA6}" 
                  ...
                  

                  If you want to use that and open the Windows Media Player dll (wmp.dll) instead, change my demo code above to:

                  // load a COM flavored DLL without using the registry (here we use wmp.dll)
                      QLibrary regFreeLib("wmp.dll");
                  
                  // wire up the DllGetClassObject function so we can call it
                      auto regFreeGetDllClassObject = reinterpret_cast<HRESULT (__stdcall *)(REFCLSID,REFIID,LPVOID*)> (regFreeLib.resolve("DllGetClassObject"));
                      if (nullptr == regFreeGetDllClassObject)
                          qFatal("wiring up DLLGetClassObject() failed");
                  
                  // try to open the Windows Media Player:
                      CComPtr<IClassFactory> pClassFactory;
                      HRESULT hr = regFreeGetDllClassObject(QUuid("{6BF52A52-394A-11D3-B153-00C04F79FAA6}"),IID_IClassFactory,(LPVOID*) &pClassFactory);
                      if (FAILED(hr))
                          qFatal("calling DLLGetClassObject() failed");
                  

                  To check that you managed to open the dll correctly, one way is to add a call generateDocumentation at the end, like this:

                  ,,,
                  
                  // if we get this far we're in business, let Qt take it from here
                      auto comObject = new QAxObject(pUnknown);
                      if (nullptr == comObject)
                          qFatal("QAxObject creation failed");
                  
                  // check that we have something live
                      qDebug() << comObject->generateDocumentation();
                  

                  the output (if it works) should have some HTML code (save it to a HTML file to view it properly).

                  Finally, you need to match the bitness of your dll (it it's 32-bits you need to compile a 32-bits Qt app and the other way around). Normally the COM infrastructure allows 32-bit/64-bit crossplaying by loading the .dll out-of-process, but since you're doing LoadLbrary() you are closer to the metal.

                  B Offline
                  B Offline
                  Bruce.Zhang
                  wrote on 16 Aug 2023, 07:05 last edited by
                  #11

                  @hskoglund I works for wmp.dll, but don't know why failed on my dll at bellow line:

                  if (nullptr == regFreeGetDllClassObject)
                          qFatal("wiring up DLLGetClassObject() failed");
                  

                  And GetLastError code is 126, which is cannot find the DLL, maybe the DLL is invalid? but I can use it in my msvc project.

                  1 Reply Last reply
                  0
                  • H Offline
                    H Offline
                    hskoglund
                    wrote on 16 Aug 2023, 07:44 last edited by
                    #12

                    If you get an error 126: if you didn't specify a path to the .dll check that it's placed together with the .exe (or one directory level above if you're running from inside Qt Creator).
                    To make sure add a qDebug on an explicit .load(), say like this:

                    ...
                        QLibrary regFreeLib("wmp.dll");
                        qDebug() << "dll loaded ok: " << regFreeLib.load();
                    ...
                    

                    Also make sure all the other .dlls that your .dll is dependent on are loaded ok (i.e. another reason for error 126).
                    If you're stuck, fire up ProcessMonitor :-)

                    B 1 Reply Last reply 16 Aug 2023, 12:42
                    0
                    • H hskoglund
                      16 Aug 2023, 07:44

                      If you get an error 126: if you didn't specify a path to the .dll check that it's placed together with the .exe (or one directory level above if you're running from inside Qt Creator).
                      To make sure add a qDebug on an explicit .load(), say like this:

                      ...
                          QLibrary regFreeLib("wmp.dll");
                          qDebug() << "dll loaded ok: " << regFreeLib.load();
                      ...
                      

                      Also make sure all the other .dlls that your .dll is dependent on are loaded ok (i.e. another reason for error 126).
                      If you're stuck, fire up ProcessMonitor :-)

                      B Offline
                      B Offline
                      Bruce.Zhang
                      wrote on 16 Aug 2023, 12:42 last edited by Bruce.Zhang
                      #13

                      @hskoglund Thanks for reminder, I copied all dlls and can load now, but failed at bellow:

                      CComPtr<IClassFactory> pClassFactory;
                          HRESULT hr = regFreeGetDllClassObject(QUuid("{A9D4AEA1-46D8-4E98-B9AA-BE93A21A58AD}"), IID_IClassFactory, (LPVOID*) &pClassFactory);
                          if (FAILED(hr))
                          {
                              auto err = GetLastError();
                              QString str = QString("GetLastError():%1").arg(err);
                              qFatal("calling DLLGetClassObject() failed");
                          }
                      

                      GetLastError() Error Number is 3.

                      Part of my .idl file like this:

                      [
                          uuid(A9D4AEA1-46D8-4E98-B9AA-BE93A21A58AD),
                          version(1.0),
                      ]
                      library DataTypesLibraryLib
                      {
                          importlib("stdole2.tlb");
                      
                          typedef
                          [
                              uuid(C15BA150-A8BA-4A10-8C5C-0D65F97A9840),
                              version(1.0)
                          ]
                      
                          enum EventTypes
                          {
                              EVENT_UNKNOWN = 0,
                              EVENT_FROM_RECIPE = 10000,
                              EVENT_START_HISTORICAL_JOB = 10001,
                              EVENT_WEB_POSITION_AND_SPEED = 10005,
                              EVENT_BLOB_OVERRUN = 10009,
                              EVENT_CUT_SIGNAL = 10019,
                              EVENT_START_JOB = 10023,
                              EVENT_STOP_JOB = 10024,
                              EVENT_START_INSPECTION = 10025,
                              EVENT_STOP_INSPECTION = 10026,
                              EVENT_WEB_EDGE = 10036,
                              EVENT_PAUSE_INSPECTION = 10045,
                              EVENT_RESTART_INSPECTION = 10046,
                              EVENT_JOB_PASSED = 10049,
                              EVENT_JOB_FAILED = 10050,
                              EVENT_DOFF_PASSED = 10051,
                              EVENT_DOFF_FAILED = 10052,
                              EVENT_ROLL_PASSED = 10053,
                              EVENT_ROLL_FAILED = 10054,
                              EVENT_EXTERNAL_RUNNEXTJOB = 10055,
                              EVENT_DENSITY_EVENT = 10079,
                              EVENT_WET_CAMERA_STATUS = 10180,
                              EVENT_WET_START_CALIBRATION = 10181,
                              EVENT_WET_STOP_CALIBRATION = 10182
                          } EventTypes;
                      
                          enum CommandTypes
                          {
                              COMMAND_UNINITIALIZED = -1,
                              COMMAND_START_JOB = 1,
                              COMMAND_STOP_JOB,
                              COMMAND_LINEPROFILE_START,
                              COMMAND_LINEPROFILE_STOP,
                              COMMAND_SNAPIMAGE
                          };
                      
                          [
                              uuid(0405e972-093d-4f16-9b4f-f9071cc8f9b2)
                          ]
                          coclass EventData
                          {
                              [default] interface IEventData;
                          };
                      }
                      
                      1 Reply Last reply
                      0
                      • H Offline
                        H Offline
                        hskoglund
                        wrote on 16 Aug 2023, 15:07 last edited by
                        #14

                        Once you're in the COM world, GetLastError() is less interesting.
                        You need the qdebug dump the hr (HResult) that GetDllClassObjet returned. Preferable in hex, something like 0x80040154 will be shown...

                        B 1 Reply Last reply 16 Aug 2023, 15:29
                        0
                        • H hskoglund
                          16 Aug 2023, 15:07

                          Once you're in the COM world, GetLastError() is less interesting.
                          You need the qdebug dump the hr (HResult) that GetDllClassObjet returned. Preferable in hex, something like 0x80040154 will be shown...

                          B Offline
                          B Offline
                          Bruce.Zhang
                          wrote on 16 Aug 2023, 15:29 last edited by
                          #15

                          @hskoglund said in How to call Registeration-Free COM dll?:

                          Once you're in the COM world, GetLastError() is less interesting.
                          You need the qdebug dump the hr (HResult) that GetDllClassObjet returned. Preferable in hex, something like 0x80040154 will be shown...

                          I've got the error code 0x80040111:In this specific case, the error code "80040111" translates to "CLASS_E_CLASSNOTAVAILABLE" Seems the specified class is not correct. I don't know why got this error, the GUID was wrong?

                          1 Reply Last reply
                          0
                          • H Offline
                            H Offline
                            hskoglund
                            wrote on 16 Aug 2023, 20:23 last edited by
                            #16

                            Yeah you got bad luck and selected the wrong GUID :-( That one at the top is the library UUID, but we're only interested in coclass-flavored UUIDs (i.e. that is what DllGetClassObject wants).
                            They're usually found at the end of an .idl file, in your case:

                            ...
                             [
                                 uuid(0405e972-093d-4f16-9b4f-f9071cc8f9b2)
                            // try this one ^
                            ]
                            coclass EventData
                            {
                                [default] interface IEventData;
                            };
                            
                            
                            B 1 Reply Last reply 17 Aug 2023, 06:26
                            0
                            • H hskoglund
                              16 Aug 2023, 20:23

                              Yeah you got bad luck and selected the wrong GUID :-( That one at the top is the library UUID, but we're only interested in coclass-flavored UUIDs (i.e. that is what DllGetClassObject wants).
                              They're usually found at the end of an .idl file, in your case:

                              ...
                               [
                                   uuid(0405e972-093d-4f16-9b4f-f9071cc8f9b2)
                              // try this one ^
                              ]
                              coclass EventData
                              {
                                  [default] interface IEventData;
                              };
                              
                              
                              B Offline
                              B Offline
                              Bruce.Zhang
                              wrote on 17 Aug 2023, 06:26 last edited by Bruce.Zhang
                              #17

                              @hskoglund Finally, I can run it now, but with some error output.
                              bellow is my code snippet:

                               LPVOID rev = nullptr;
                                  CoInitialize(rev);// Add this line because there will be  another output  of missing the CoInitialize. 
                              
                                  // load a COM flavored DLL without using the registry (here we use the Wrapper example)
                                  QLibrary regFreeLib("DataTypesLibrary.dll");
                                  qDebug() << "dll loaded ok: " << regFreeLib.load();
                              
                                  // wire up the DllGetClassObject function so we can call it
                                  auto regFreeGetDllClassObject = reinterpret_cast<HRESULT(__stdcall*)(REFCLSID, REFIID, LPVOID*)> (regFreeLib.resolve("DllGetClassObject"));
                              
                                  if (nullptr == regFreeGetDllClassObject)
                                  {
                                      auto err = GetLastError();
                                      QString str = QString("GetLastError():%1").arg(err);
                                      qFatal("wiring up DLLGetClassObject() failed");
                                  }
                              
                                  // try to call it
                                  CComPtr<IClassFactory> pClassFactory;
                                  HRESULT hr = regFreeGetDllClassObject(QUuid("{0b4be3c3-f304-4f98-a870-e2933dee5b7e}"), IID_IClassFactory, (LPVOID*) &pClassFactory);
                              
                                  if (FAILED(hr))
                                  {
                                      auto err = GetLastError();
                                      QString str = QString("DLLGetClassObject GetLastError():%1 HRESULT:%2").arg(err).arg(hr, 8,  16, QLatin1Char('0'));
                                      qFatal(str.toStdString().c_str());
                                  }
                              
                                  for (int i = 0; i < 1000000; i++)
                                  {
                                      // and then obtain the IUnknown ptr
                                      CComPtr<IUnknown> pUnknown;
                                      hr = pClassFactory->CreateInstance(nullptr, IID_IUnknown, (LPVOID*) &pUnknown);
                              
                                      if (FAILED(hr))
                                          qFatal("createInstance() failed");
                              
                                      // if we get this far we're in business, let Qt take it from here
                                      auto comObject = new QAxObject(pUnknown);
                                      auto pEventData = reinterpret_cast<DataTypesLibraryLib::IEventData*>(comObject);
                                      pEventData->SetCD(20.22);
                                      qDebug() << "CD:" << pEventData->CD();
                                      delete pEventData;
                              
                                  }
                              
                                  qDebug() << "This is the End";
                              

                              And bellow is the output when exec "pEventData->SetCD(20.22);" each loop.

                              mincore\com\oleaut32\typelib\tlibapi.cpp(2279)\OLEAUT32.dll!00007FF8FE894743: (caller: 00007FF8FE87847B) ReturnHr(239969) tid(5a8c) 8002801D Library not registered.
                              void __cdecl MetaObjectGenerator::readClassInfo(void): IDispatch 0x28bf7aa0040 does not provide interface information
                              CD: 20.22
                              

                              BTW: I generated the .h & .cpp using "dumpcpp DataTypesLibrary.dll". And DataTypesLibraryLib::IEventData is from the .h file.

                              1 Reply Last reply
                              0
                              • H Offline
                                H Offline
                                hskoglund
                                wrote on 17 Aug 2023, 10:26 last edited by
                                #18

                                Hi, dumpcpp can be a useful tool but it does not support RegistrationFree COM dlls. Usually the .cpp code generated (in DataTypesLibrarylib.cpp) will, in the constructor, include a call to QAxWidget->setControl(), and that call relies on the registry to work :-(
                                And that's probably why you get that error "Library not registered".

                                Once you've started using a QAxObject, best is to avoid stunts like ... reinterpret_cast<DataTypesLibraryLib::IEventData*>(comObject); it will only come back to haunt you :-)

                                I see you're not using the UUID i suggested but another one?

                                Once you gotten a QAxObject up and running, start by checking it's validity by calling generateDocumentation: (i.e. from my code earlier in this topic):

                                / check that we have something live
                                    qDebug() << comObject->generateDocumentation();
                                

                                If that works, then try using your comObject say like this:

                                comObject->setProperty("CD",20.22);
                                qDebug() << "CD:" << comObject->property("CD");
                                
                                B 1 Reply Last reply 18 Aug 2023, 15:58
                                0
                                • H hskoglund
                                  17 Aug 2023, 10:26

                                  Hi, dumpcpp can be a useful tool but it does not support RegistrationFree COM dlls. Usually the .cpp code generated (in DataTypesLibrarylib.cpp) will, in the constructor, include a call to QAxWidget->setControl(), and that call relies on the registry to work :-(
                                  And that's probably why you get that error "Library not registered".

                                  Once you've started using a QAxObject, best is to avoid stunts like ... reinterpret_cast<DataTypesLibraryLib::IEventData*>(comObject); it will only come back to haunt you :-)

                                  I see you're not using the UUID i suggested but another one?

                                  Once you gotten a QAxObject up and running, start by checking it's validity by calling generateDocumentation: (i.e. from my code earlier in this topic):

                                  / check that we have something live
                                      qDebug() << comObject->generateDocumentation();
                                  

                                  If that works, then try using your comObject say like this:

                                  comObject->setProperty("CD",20.22);
                                  qDebug() << "CD:" << comObject->property("CD");
                                  
                                  B Offline
                                  B Offline
                                  Bruce.Zhang
                                  wrote on 18 Aug 2023, 15:58 last edited by Bruce.Zhang
                                  #19

                                  @hskoglund Actually the last GUID is what I pasted. I tried the comObject->generateDocumentation();
                                  The output also contains .... Library not registered.

                                  
                                  mincore\com\oleaut32\typelib\tlibapi.cpp(2279)\OLEAUT32.dll!00007FFCB00B4743: (caller: 00007FFCB009847B) ReturnHr(1) tid(3864) 8002801D Library not registered.
                                  void __cdecl MetaObjectGenerator::readClassInfo(void): IDispatch 0x22af47e0000 does not provide interface information
                                  mincore\com\oleaut32\typelib\tlibapi.cpp(2279)\OLEAUT32.dll!00007FFCB00B4743: (caller: 00007FFCB009847B) ReturnHr(2) tid(3864) 8002801D Library not registered.
                                  mincore\com\oleaut32\typelib\tlibapi.cpp(2279)\OLEAUT32.dll!00007FFCB00B4743: (caller: 00007FFCB009847B) ReturnHr(3) tid(3864) 8002801D Library not registered.
                                  "<h1 align=center> Reference</h1>\n<p>The  COM object is a QAxObject with the CLSID .</p>\n<h3>Interfaces</h3>\n<ul>\n</ul>\n<h3>Event Interfaces</h3>\n<ul>\n</ul>\n<h2>Public Slots:</h2>\n<ul>\n</ul>\n<h2>Signals:</h2>\n<ul>\n<li>void <a href=\"#exception\"><b>exception</b></a>(int code, QString source, QString disc, QString help);</li>\n<li>void <a href=\"#propertyChanged\"><b>propertyChanged</b></a>(QString name);</li>\n<li>void <a href=\"#signal\"><b>signal</b></a>(QString name, int argc, void* argv);</li>\n</ul>\n<h2>Properties:</h2>\n<ul>\n<li>QString <a href=\"#objectName\"><b>objectName</b></a>;</li>\n<li>QString <a href=\"#control\"><b>control</b></a>;</li>\n</ul>\n<hr><h2>Member Function Documentation</h2>\n<h3><a name=exception></a>void exception (int code, QString source, QString disc, QString help)<tt> [signal]</tt></h3>\n<p>Connect a slot to this signal:<pre>\n\tQObject::connect(object, SIGNAL(exception(int, QString, QString, QString)), receiver, SLOT(someSlot(int, QString, QString, QString)));</pre>\n\n<h3><a name=propertyChanged></a>void propertyChanged (QString name)<tt> [signal]</tt></h3>\n<p>Connect a slot to this signal:<pre>\n\tQObject::connect(object, SIGNAL(propertyChanged(QString)), receiver, SLOT(someSlot(QString)));</pre>\n\n<h3><a name=signal></a>void signal (QString name, int argc, void* argv)<tt> [signal]</tt></h3>\n<p>Connect a slot to this signal:<pre>\n\tQObject::connect(object, SIGNAL(signal(QString, int, void*)), receiver, SLOT(someSlot(QString, int, void*)));</pre>\n\n<hr><h2>Property Documentation</h2>\n<h3><a name=objectName></a>QString objectName</h3>\n<p>\n<p>Read this property's value using QObject::property:<pre>\n\tQString val = object->property(\"objectName\").toString();\n</pre>\nSet this property' value using QObject::setProperty:<pre>\n\tQString newValue = ...\n\tobject->setProperty(\"objectName\", newValue);\n</pre>\nOr using the <a href=\"#setObjectName\">setObjectName</a> slot.\n\n<h3><a name=control></a>QString control</h3>\n<p>\n<p>Read this property's value using QObject::property:<pre>\n\tQString val = object->property(\"control\").toString();\n</pre>\nSet this property' value using QObject::setProperty:<pre>\n\tQString newValue = ...\n\tobject->setProperty(\"control\", newValue);\n</pre>\nOr using the <a href=\"#setControl\">setControl</a> slot.\n\n"
                                  

                                  The messages outputs when execute "comObject->generateDocumentation();"

                                  1 Reply Last reply
                                  0
                                  • H Offline
                                    H Offline
                                    hskoglund
                                    wrote on 18 Aug 2023, 17:25 last edited by
                                    #20

                                    Hmm if you're testing on a pretty old Windows 10, you might have been bitten by this bug:
                                    https://bugreports.qt.io/browse/QTBUG-63789

                                    Also I dug up some old code for debugging COM, try these lines:

                                    ...
                                    // try to call it
                                        CComPtr<IClassFactory> pClassFactory;
                                        HRESULT hr = regFreeGetDllClassObject(QUuid("{0405e972-093d-4f16-9b4f-f9071cc8f9b2}"),IID_IClassFactory,(LPVOID*) &pClassFactory);
                                        if (FAILED(hr))
                                            qFatal("calling DLLGetClassObject() failed");
                                    
                                    // and then obtain the IUnknown ptr
                                        CComPtr<IUnknown> pUnknown;
                                        hr = pClassFactory->CreateInstance(nullptr,IID_IUnknown,(LPVOID*) &pUnknown);
                                        if (FAILED(hr))
                                            qFatal("createInstance() failed");
                                    
                                    // if we get this far we're in business, let Qt take it from here
                                        auto comObject = new QAxObject(pUnknown);
                                        if (nullptr == comObject)
                                            qFatal("QAxObject creation failed");
                                    
                                    // *** some debugging code
                                    // try to obtain a IDispatch ptr
                                        CComPtr<IDispatch> pDispatch;
                                        comObject->queryInterface(QUuid(IID_IDispatch),(void**) &pDispatch);
                                        if (nullptr == pDispatch)
                                            qFatal("Error: an IDispatch interface was not found.");
                                    
                                    // get the ITypeInfo ptr
                                        UINT uTypeInfo;
                                        hr = pDispatch->GetTypeInfoCount(&uTypeInfo);
                                        if (FAILED(hr) || (uTypeInfo < 1))
                                            qFatal("Sorry, could not locate any type information");
                                        if (1 != uTypeInfo)
                                            qFatal("Expected GetTypeInfoCount() to return 1 but alas");
                                    
                                        CComPtr<ITypeInfo> pTypeInfo;
                                        if FAILED(pDispatch->GetTypeInfo(0,LOCALE_SYSTEM_DEFAULT,&pTypeInfo))
                                            qFatal("Error: GetTypeInfo() failed");
                                    
                                    // ok have ITypeInfo, use it to get the ITypeLib
                                        CComPtr<ITypeLib> pTypeLib;
                                        UINT uTypeInfoIndex;
                                        if FAILED(pTypeInfo->GetContainingTypeLib(&pTypeLib,&uTypeInfoIndex))
                                            qFatal("Error: GetContainingTypeLib() failed");
                                    
                                    // if you get this far you comObject is most likely ok (never mind generateDocumentation) so try your dll
                                        comObject->setProperty("CD",20.22);
                                        qDebug() << "CD:" << comObject->property("CD");
                                    
                                    B 1 Reply Last reply 19 Aug 2023, 16:07
                                    0
                                    • H hskoglund
                                      18 Aug 2023, 17:25

                                      Hmm if you're testing on a pretty old Windows 10, you might have been bitten by this bug:
                                      https://bugreports.qt.io/browse/QTBUG-63789

                                      Also I dug up some old code for debugging COM, try these lines:

                                      ...
                                      // try to call it
                                          CComPtr<IClassFactory> pClassFactory;
                                          HRESULT hr = regFreeGetDllClassObject(QUuid("{0405e972-093d-4f16-9b4f-f9071cc8f9b2}"),IID_IClassFactory,(LPVOID*) &pClassFactory);
                                          if (FAILED(hr))
                                              qFatal("calling DLLGetClassObject() failed");
                                      
                                      // and then obtain the IUnknown ptr
                                          CComPtr<IUnknown> pUnknown;
                                          hr = pClassFactory->CreateInstance(nullptr,IID_IUnknown,(LPVOID*) &pUnknown);
                                          if (FAILED(hr))
                                              qFatal("createInstance() failed");
                                      
                                      // if we get this far we're in business, let Qt take it from here
                                          auto comObject = new QAxObject(pUnknown);
                                          if (nullptr == comObject)
                                              qFatal("QAxObject creation failed");
                                      
                                      // *** some debugging code
                                      // try to obtain a IDispatch ptr
                                          CComPtr<IDispatch> pDispatch;
                                          comObject->queryInterface(QUuid(IID_IDispatch),(void**) &pDispatch);
                                          if (nullptr == pDispatch)
                                              qFatal("Error: an IDispatch interface was not found.");
                                      
                                      // get the ITypeInfo ptr
                                          UINT uTypeInfo;
                                          hr = pDispatch->GetTypeInfoCount(&uTypeInfo);
                                          if (FAILED(hr) || (uTypeInfo < 1))
                                              qFatal("Sorry, could not locate any type information");
                                          if (1 != uTypeInfo)
                                              qFatal("Expected GetTypeInfoCount() to return 1 but alas");
                                      
                                          CComPtr<ITypeInfo> pTypeInfo;
                                          if FAILED(pDispatch->GetTypeInfo(0,LOCALE_SYSTEM_DEFAULT,&pTypeInfo))
                                              qFatal("Error: GetTypeInfo() failed");
                                      
                                      // ok have ITypeInfo, use it to get the ITypeLib
                                          CComPtr<ITypeLib> pTypeLib;
                                          UINT uTypeInfoIndex;
                                          if FAILED(pTypeInfo->GetContainingTypeLib(&pTypeLib,&uTypeInfoIndex))
                                              qFatal("Error: GetContainingTypeLib() failed");
                                      
                                      // if you get this far you comObject is most likely ok (never mind generateDocumentation) so try your dll
                                          comObject->setProperty("CD",20.22);
                                          qDebug() << "CD:" << comObject->property("CD");
                                      
                                      B Offline
                                      B Offline
                                      Bruce.Zhang
                                      wrote on 19 Aug 2023, 16:07 last edited by Bruce.Zhang
                                      #21

                                      @hskoglund Hi, I test previous debug code, now failed at

                                      hr = pDispatch->GetTypeInfo(0, LOCALE_SYSTEM_DEFAULT, &pTypeInfo);
                                      
                                      if FAILED(hr)
                                             qFatal(QString("Error: GetTypeInfo() failed: %1").arg(hr, 8,  16, QLatin1Char('0')).toStdString().c_str());
                                      

                                      and the hr=0x8002801d

                                      1 Reply Last reply
                                      0
                                      • H Offline
                                        H Offline
                                        hskoglund
                                        wrote on 19 Aug 2023, 18:02 last edited by hskoglund
                                        #22

                                        0x8002801d (TYPE_E_LIBNOTREGISTERED) occurs I think because it's trying to read class information from the registry (which is a no-no since we're doing registration-free COM).

                                        It could be because the comObject you created is not the top object or that it is dependent on some other COM class to function (maybe test with some other coclass UUIDs listed in your .IDL file, i.e. look for this pattern [
                                        uuid(xxxx-xxxx-xx)
                                        ]
                                        coclass yyyy)

                                        It can also be a language/implementation reason, for example if your dll is written in C#, the same version of .NET 8 or .NET Framework needs to be installed on both the dev. PC and the target PC.

                                        To test your .dll from C#, try calling stuff in your COM .dll from a test program using the same type of calling that QAxObject does, in C# you do this via the InvokeMember method (example here )

                                        Finally, to debug this, download Process Monitor set a filter to exclude everything except the process name of your .exe test app. Look for registry read accesses to HKEY_CLASSES_ROOT :-)

                                        Edit: I looked if you could instead use the classes that dumpcpp gives you (from doing a "dumpcpp DataTypesLibrary.dll") but alas they are just inheriting from QAxObject so the same error 0x8002801d will probably occur with them as well.

                                        B 1 Reply Last reply 21 Aug 2023, 14:02
                                        0
                                        • H hskoglund
                                          19 Aug 2023, 18:02

                                          0x8002801d (TYPE_E_LIBNOTREGISTERED) occurs I think because it's trying to read class information from the registry (which is a no-no since we're doing registration-free COM).

                                          It could be because the comObject you created is not the top object or that it is dependent on some other COM class to function (maybe test with some other coclass UUIDs listed in your .IDL file, i.e. look for this pattern [
                                          uuid(xxxx-xxxx-xx)
                                          ]
                                          coclass yyyy)

                                          It can also be a language/implementation reason, for example if your dll is written in C#, the same version of .NET 8 or .NET Framework needs to be installed on both the dev. PC and the target PC.

                                          To test your .dll from C#, try calling stuff in your COM .dll from a test program using the same type of calling that QAxObject does, in C# you do this via the InvokeMember method (example here )

                                          Finally, to debug this, download Process Monitor set a filter to exclude everything except the process name of your .exe test app. Look for registry read accesses to HKEY_CLASSES_ROOT :-)

                                          Edit: I looked if you could instead use the classes that dumpcpp gives you (from doing a "dumpcpp DataTypesLibrary.dll") but alas they are just inheriting from QAxObject so the same error 0x8002801d will probably occur with them as well.

                                          B Offline
                                          B Offline
                                          Bruce.Zhang
                                          wrote on 21 Aug 2023, 14:02 last edited by Bruce.Zhang
                                          #23

                                          @hskoglund My COM dll was wrote in c++.
                                          I tried different UUID with no luck. And also the process monitor shows that the app was not access this registry.

                                          the idl file as follows:

                                          
                                          import "oaidl.idl";
                                          import "ocidl.idl";
                                          
                                           [
                                              object,
                                              uuid(d5c2a0e4-6b92-4278-ba56-479475ccfc42),
                                              dual,
                                              nonextensible,
                                              pointer_default(unique)
                                          ]
                                          interface IEventData : IDispatch
                                          {
                                              [propget, helpstring("property Key")] HRESULT Key([out, retval]long long *pVal);
                                              [propput, helpstring("property Key")] HRESULT Key([in] long long val);
                                              [propget, helpstring("property CD")] HRESULT CD([out, retval]double *pVal);
                                              [propput, helpstring("property CD")] HRESULT CD([in]double val);
                                              [propget, helpstring("property CameraCD")] HRESULT CameraCD([out, retval]double *pVal);
                                              [id(2)] HRESULT Clone([out] IDispatch **pVal);
                                          };
                                          
                                          [
                                              object,
                                              uuid(7e04492a-7143-4add-9ed3-a03bd023d63f),
                                              dual,
                                              nonextensible,
                                              pointer_default(unique)
                                          ]
                                          interface IFlawData : IDispatch
                                          {
                                              [propget, helpstring("property Key")] HRESULT Key([out, retval]long long *pVal);
                                              [propput, helpstring("property Key")] HRESULT Key([in] long long val);
                                              [propget, helpstring("property Deleted")] HRESULT Deleted([out, retval]VARIANT_BOOL *pVal);
                                              [propput, helpstring("property Deleted")] HRESULT Deleted([in]VARIANT_BOOL val);
                                              [id(1)] HRESULT Deserialize(unsigned char *pBytes);
                                          };
                                          
                                          [
                                              object,
                                              uuid(a4df6d7e-28e5-4e9f-8eab-10b2c38a636c),
                                              dual,
                                              nonextensible,
                                              pointer_default(unique)
                                          ]
                                          interface IImageData : IDispatch
                                          {
                                              [propget, helpstring("property Key")] HRESULT Key([out, retval]long long *pVal);
                                              [propput, helpstring("property Key")] HRESULT Key([in] long long val);
                                              [propget, helpstring("property JobKey")] HRESULT JobKey([out, retval]long *pVal);
                                              [propput, helpstring("property JobKey")] HRESULT JobKey([in] long val);
                                              [propget, helpstring("property ImageObject")] HRESULT ImageObject([out, retval] VARIANT* pVal);
                                              [propput, helpstring("property ImageObject")] HRESULT ImageObject([in] VARIANT val);
                                              [propget, helpstring("property Deleted")] HRESULT Deleted([out, retval]VARIANT_BOOL *pVal);
                                              [propput, helpstring("property Deleted")] HRESULT Deleted([in]VARIANT_BOOL val);
                                              [id(1)] HRESULT Deserialize(unsigned char *pBytes);
                                          };
                                          
                                          [
                                              object,
                                              uuid(631d7379-8a6c-4941-8ed1-8ad9b34bf558),
                                              dual,
                                              nonextensible,
                                              pointer_default(unique)
                                          ]
                                          interface ILineHardwareData : IDispatch
                                          {
                                              // LineHardware
                                              [propget, helpstring("property IP")] HRESULT IP([out, retval]BSTR *pVal);
                                              [propput, helpstring("property IP")] HRESULT IP([in]BSTR val);
                                              [propget, helpstring("property Port")] HRESULT Port([out, retval]long *pVal);
                                              [propput, helpstring("property Port")] HRESULT Port([in] long val);
                                              [propget, helpstring("property StopPixel")] HRESULT StopPixel([out, retval]long *pVal);
                                              [propput, helpstring("property StopPixel")] HRESULT StopPixel([in] long val);
                                          };
                                          
                                          [
                                              object,
                                              uuid(512F49E3-6FFE-49FF-9E84-1DAC0650428A),
                                              nonextensible,
                                              pointer_default(unique)
                                          ]
                                          interface IJobData : IDispatch
                                          {
                                              // TODO! these deserve known dispids
                                              [propget, helpstring("property Key")] HRESULT Key([out, retval] long* pVal);
                                              [propput, helpstring("property Key")] HRESULT Key([in] long val);
                                              [propget, helpstring("property OperatorName")] HRESULT OperatorName([out, retval] BSTR* pVal);
                                              [propput, helpstring("property OperatorName")] HRESULT OperatorName([in] BSTR val);
                                              [propget, helpstring("property CompanyName")] HRESULT CompanyName([out, retval] BSTR* pVal);
                                              [propput, helpstring("property CompanyName")] HRESULT CompanyName([in] BSTR val);
                                              [propget, helpstring("property InspectionType")] HRESULT InspectionType([out, retval] BSTR* pVal);
                                              [propput, helpstring("property InspectionType")] HRESULT InspectionType([in] BSTR val);
                                              [propget, helpstring("property MaterialType")] HRESULT MaterialType([out, retval] BSTR* pVal);
                                              [propput, helpstring("property MaterialType")] HRESULT MaterialType([in] BSTR val);
                                              [propget, helpstring("property OrderNumber")] HRESULT OrderNumber([out, retval] BSTR* pVal);
                                              [propput, helpstring("property OrderNumber")] HRESULT OrderNumber([in] BSTR val);
                                              [propget, helpstring("property JobID")] HRESULT JobID([out, retval] BSTR* pVal);
                                              [propput, helpstring("property JobID")] HRESULT JobID([in] BSTR val);
                                              [propget, helpstring("property StartDoffNumber")] HRESULT StartDoffNumber([out, retval] long* pVal);
                                              [propput, helpstring("property StartDoffNumber")] HRESULT StartDoffNumber([in] long val);
                                              [propget, helpstring("property StartDateTime")] HRESULT StartDateTime([out, retval]DATE *pVal);
                                              [propput, helpstring("property StartDateTime")] HRESULT StartDateTime([in]DATE val);
                                              [propget, helpstring("property EndDateTime")] HRESULT EndDateTime([out, retval]DATE* pVal);
                                              [propput, helpstring("property EndDateTime")] HRESULT EndDateTime([in]DATE val);
                                              [propget, helpstring("property LeftEdge")] HRESULT LeftEdge([out, retval]double* pVal);
                                              [propput, helpstring("property LeftEdge")] HRESULT LeftEdge([in]double val);
                                              [propget, helpstring("property RightEdge")] HRESULT RightEdge([out, retval]double* pVal);
                                              [propput, helpstring("property RightEdge")] HRESULT RightEdge([in]double val);
                                              [propget, helpstring("property JobLength")] HRESULT JobLength([out, retval]double* pVal);
                                              [propput, helpstring("property JobLength")] HRESULT JobLength([in]double val);
                                              [propget, helpstring("property Comment")] HRESULT Comment([out, retval] BSTR* pVal);
                                              [propput, helpstring("property Comment")] HRESULT Comment([in] BSTR val);
                                              [propget, helpstring("property Product")] HRESULT Product([out, retval] BSTR* pVal);
                                              [propput, helpstring("property Product")] HRESULT Product([in] BSTR val);
                                              [propget, helpstring("property Recipe")] HRESULT Recipe([out, retval] BSTR* pVal);
                                              [propput, helpstring("property Recipe")] HRESULT Recipe([in] BSTR val);
                                              [propget, helpstring("property LineHardware")] HRESULT LineHardware([out, retval] BSTR* pVal);
                                              [propput, helpstring("property LineHardware")] HRESULT LineHardware([in] BSTR val);
                                              [propget, helpstring("property Lanes")] HRESULT Lanes([out, retval] BSTR* pVal);
                                              [propput, helpstring("property Lanes")] HRESULT Lanes([in] BSTR val);
                                          };
                                          
                                          [
                                              object,
                                              uuid(8691d19e-004d-461e-9a15-a0b6c11e65b7),
                                              dual,
                                              nonextensible,
                                              pointer_default(unique)
                                          ]
                                          interface IJobQueueData : IDispatch
                                          {
                                              // TODO! these deserve known dispids
                                              [propget, helpstring("property Key")] HRESULT Key([out, retval] long* pVal);
                                              [propput, helpstring("property Key")] HRESULT Key([in] long val);
                                              [propget, helpstring("property OperatorName")] HRESULT OperatorName([out, retval] BSTR* pVal);
                                              [propput, helpstring("property OperatorName")] HRESULT OperatorName([in] BSTR val);
                                              [propget, helpstring("property CompanyName")] HRESULT CompanyName([out, retval] BSTR* pVal);
                                              [propput, helpstring("property CompanyName")] HRESULT CompanyName([in] BSTR val);
                                              [propget, helpstring("property InspectionType")] HRESULT InspectionType([out, retval] BSTR* pVal);
                                              [propput, helpstring("property InspectionType")] HRESULT InspectionType([in] BSTR val);
                                              [propget, helpstring("property MaterialType")] HRESULT MaterialType([out, retval] BSTR* pVal);
                                              [propput, helpstring("property MaterialType")] HRESULT MaterialType([in] BSTR val);
                                              [propget, helpstring("property OrderNumber")] HRESULT OrderNumber([out, retval] BSTR* pVal);
                                              [propput, helpstring("property OrderNumber")] HRESULT OrderNumber([in] BSTR val);
                                              [propget, helpstring("property JobID")] HRESULT JobID([out, retval] BSTR* pVal);
                                              [propput, helpstring("property JobID")] HRESULT JobID([in] BSTR val);
                                              [propget, helpstring("property StartDoffNumber")] HRESULT StartDoffNumber([out, retval] long* pVal);
                                              [propput, helpstring("property StartDoffNumber")] HRESULT StartDoffNumber([in] long val);
                                              [propget, helpstring("property Comment")] HRESULT Comment([out, retval] BSTR* pVal);
                                              [propput, helpstring("property Comment")] HRESULT Comment([in] BSTR val);
                                              [propget, helpstring("property Iterations")] HRESULT Iterations([out, retval] long* pVal);
                                              [propput, helpstring("property Iterations")] HRESULT Iterations([in] long val);
                                              [propget, helpstring("property JobOrderNumber")] HRESULT JobOrderNumber([out, retval] long* pVal);
                                              [propput, helpstring("property JobOrderNumber")] HRESULT JobOrderNumber([in] long val);
                                              [propget, helpstring("property AutoStartDoffNumber")] HRESULT AutoStartDoffNumber([out, retval] BOOL* pVal);
                                              [propput, helpstring("property AutoStartDoffNumber")] HRESULT AutoStartDoffNumber([in] BOOL val);
                                              [propget, helpstring("property ProductKey")] HRESULT ProductKey([out, retval] LONG* pVal);
                                              [propput, helpstring("property ProductKey")] HRESULT ProductKey([in] LONG val);
                                              [propget, helpstring("property LaneSetupKey")] HRESULT LaneSetupKey([out, retval] LONG* pVal);
                                              [propput, helpstring("property LaneSetupKey")] HRESULT LaneSetupKey([in] LONG val);
                                          };
                                          
                                          [
                                              object,
                                              uuid(EC7181F6-D03B-4DA5-802C-1B83D562DC3E),
                                              nonextensible,
                                              pointer_default(unique)
                                          ]
                                          interface IProductData : IDispatch
                                          {
                                              // TODO! these deserve known dispids
                                              [propget, helpstring("property Key")] HRESULT Key([out, retval] long* pVal);
                                              [propput, helpstring("property Key")] HRESULT Key([in] long val);
                                              [propget, helpstring("property Name")] HRESULT Name([out, retval] BSTR* pVal);
                                              [propput, helpstring("property Name")] HRESULT Name([in] BSTR val);
                                              [propget, helpstring("property RecipePath")] HRESULT RecipePath([out, retval] BSTR* pVal);
                                              [propput, helpstring("property RecipePath")] HRESULT RecipePath([in] BSTR val);
                                              [propget, helpstring("property PluginConfigs")] HRESULT PluginConfigs([out, retval] BSTR* pVal);
                                              [propput, helpstring("property PluginConfigs")] HRESULT PluginConfigs([in] BSTR val);
                                          };
                                          
                                          [
                                          	object,
                                          	uuid(88788dff-32ff-4c94-ac7c-3c0723444aeb),
                                          	dual,
                                          	nonextensible,
                                          	pointer_default(unique)
                                          ]
                                          interface ICommandData : IDispatch
                                          {
                                              [propput, helpstring("property Command")] HRESULT Command([in] long val);
                                              [propget, helpstring("property Value")] HRESULT Value([out, retval]VARIANT *pVal);
                                              [propput, helpstring("property Value")] HRESULT Value([in] VARIANT val);
                                              [propget, helpstring("property Value2")] HRESULT Value2([out, retval]VARIANT *pVal);
                                              [propput, helpstring("property Value2")] HRESULT Value2([in] VARIANT val);
                                              [propget, helpstring("property Value3")] HRESULT Value3([out, retval]VARIANT *pVal);
                                              [propput, helpstring("property Value3")] HRESULT Value3([in] VARIANT val);
                                              [propget, helpstring("property Value4")] HRESULT Value4([out, retval]VARIANT *pVal);
                                              [propput, helpstring("property Value4")] HRESULT Value4([in] VARIANT val);
                                              [propget, helpstring("property Value5")] HRESULT Value5([out, retval]VARIANT* pVal);
                                              [propput, helpstring("property Value5")] HRESULT Value5([in] VARIANT val);
                                              // Methods
                                              HRESULT SerializeClassToString([out]BSTR *pSerializedString);
                                          };
                                          [
                                              object,
                                              uuid(3909d320-59ef-4f64-a795-0188c06bf87e),
                                              dual,
                                              nonextensible,
                                              pointer_default(unique)
                                          ]
                                          interface ILaneData : IDispatch
                                          {
                                              [propget, helpstring("property Description")] HRESULT Description([out, retval] BSTR* pVal);
                                              [propput, helpstring("property Description")] HRESULT Description([in] BSTR val);
                                              [propget, helpstring("property Width")] HRESULT Width([out, retval]double *pVal);
                                              [propput, helpstring("property Width")] HRESULT Width([in]double val);
                                              [propget, helpstring("property Enabled")] HRESULT Enabled([out, retval] VARIANT_BOOL* pVal);
                                              [propput, helpstring("property Enabled")] HRESULT Enabled([in] VARIANT_BOOL val);
                                              [propget, helpstring("property LeftMargin")] HRESULT LeftMargin([out, retval]double *pVal);
                                              [propput, helpstring("property LeftMargin")] HRESULT LeftMargin([in]double val);
                                              [propget, helpstring("property RightMargin")] HRESULT RightMargin([out, retval]double *pVal);
                                              [propput, helpstring("property RightMargin")] HRESULT RightMargin([in]double val);
                                          };
                                          [
                                          	object,
                                          	uuid(1c64d549-f760-43ba-8ae1-dbddf1720a54),
                                          	dual,
                                          	nonextensible,
                                          	pointer_default(unique)
                                          ]
                                          interface ILaneSetupData : IDispatch
                                          {
                                              // NOTE: Don't move Lanes from the top spot unless you change const int "LANE_OBJECT_ARRAY_INDEX = 0;"
                                              // in c:\development\opsisnextgen\BuildCommonFiles\Wintriss\DatabaseLibrary\SQLEngine.cs
                                              [propget, helpstring("property Lanes")] HRESULT Lanes([out, retval] SAFEARRAY(VARIANT)* pVal);
                                              [propput, helpstring("property Lanes")] HRESULT Lanes([in] SAFEARRAY(VARIANT) val);
                                              [propget, helpstring("property Key")] HRESULT Key([out, retval]long *pVal);
                                              [propput, helpstring("property Key")] HRESULT Key([in] long val);
                                              [propget, helpstring("property Name")] HRESULT Name([out, retval] BSTR *pVal);
                                              [propput, helpstring("property Name")] HRESULT Name([in] BSTR val);
                                              [propget, helpstring("property EdgeDetectionType")] HRESULT EdgeDetectionType([out, retval]long *pVal);
                                              [propput, helpstring("property EdgeDetectionType")] HRESULT EdgeDetectionType([in] long val);
                                              [propget, helpstring("property UsePreSlit")] HRESULT UsePreSlit([out, retval] VARIANT_BOOL* pVal);
                                              [propput, helpstring("property UsePreSlit")] HRESULT UsePreSlit([in] VARIANT_BOOL val);
                                              [propget, helpstring("property CDReference")] HRESULT CDReference([out, retval]long *pVal);
                                              [propput, helpstring("property CDReference")] HRESULT CDReference([in] long val);
                                              [propget, helpstring("property NumberOfLanes")] HRESULT NumberOfLanes([out, retval]long *pVal);
                                              [propget, helpstring("property UseLeftOffset")] HRESULT UseLeftOffset([out, retval] VARIANT_BOOL* pVal);
                                              [propput, helpstring("property UseLeftOffset")] HRESULT UseLeftOffset([in] VARIANT_BOOL val);
                                              [propget, helpstring("property LeftWebMargin")] HRESULT LeftWebMargin([out, retval]double *pVal);
                                              [propput, helpstring("property LeftWebMargin")] HRESULT LeftWebMargin([in]double val);
                                              [propget, helpstring("property RightWebMargin")] HRESULT RightWebMargin([out, retval]double *pVal);
                                              [propput, helpstring("property RightWebMargin")] HRESULT RightWebMargin([in]double val);
                                              [propget, helpstring("property FirstKnifePosition")] HRESULT FirstKnifePosition([out, retval]double *pVal);
                                              [propput, helpstring("property FirstKnifePosition")] HRESULT FirstKnifePosition([in]double val);
                                          };
                                          [
                                              object,
                                              uuid(C29B84A8-422B-4460-A608-21B7EE023D0A),
                                              dual,
                                              nonextensible,
                                              pointer_default(unique)
                                          ]
                                          interface IJobLane : IDispatch
                                          {
                                              [propget, helpstring("property Key")] HRESULT Key([out, retval] long *pVal);
                                              [propput, helpstring("property Key")] HRESULT Key([in] long val);
                                              [propget, helpstring("property JobKey")] HRESULT JobKey([out, retval] long *pVal);
                                              [propput, helpstring("property JobKey")] HRESULT JobKey([in] long val);
                                              [propget, helpstring("property LaneNumber")] HRESULT LaneNumber([out, retval] long *pVal);
                                              [propput, helpstring("property LaneNumber")] HRESULT LaneNumber([in] long val);
                                              [propget, helpstring("property StartCD")] HRESULT StartCD([out, retval]double *pVal);
                                              [propput, helpstring("property StartCD")] HRESULT StartCD([in]double val);
                                              [propget, helpstring("property StopCD")] HRESULT StopCD([out, retval]double *pVal);
                                              [propput, helpstring("property StopCD")] HRESULT StopCD([in]double val);
                                              [propget, helpstring("property Enabled")] HRESULT Enabled([out, retval] VARIANT_BOOL *pVal);
                                              [propput, helpstring("property Enabled")] HRESULT Enabled([in] VARIANT_BOOL val);
                                          };
                                          
                                          [
                                          	object,
                                          	uuid(c50d4146-39e2-406f-81d8-f4961761b61f),
                                          	dual,
                                          	nonextensible,
                                          	pointer_default(unique)
                                          ]
                                          interface IErrorMessageData : IDispatch
                                          {
                                              [propget, helpstring("property Message")] HRESULT Message([out, retval]BSTR *pVal);
                                              [propput, helpstring("property Message")] HRESULT Message([in]BSTR val);
                                              [propget, helpstring("property IPAddress")] HRESULT IPAddress([out, retval]BSTR *pVal);
                                              [propput, helpstring("property IPAddress")] HRESULT IPAddress([in]BSTR val);
                                              [propget, helpstring("property OriginalData")] HRESULT OriginalData([out, retval]BSTR *pVal);
                                              [propput, helpstring("property OriginalData")] HRESULT OriginalData([in]BSTR val);
                                              [propget, helpstring("property Port")] HRESULT Port([out, retval]long *pVal);
                                              [propput, helpstring("property Port")] HRESULT Port([in] long val);
                                              [propget, helpstring("property DateTime")] HRESULT DateTime([out, retval]DATE *pVal);
                                              [propput, helpstring("property DateTime")] HRESULT DateTime([in]DATE val);
                                              [id(1)] HRESULT Deserialize(unsigned char *pBytes);
                                          };
                                          
                                          [
                                              uuid(A9D4AEA1-46D8-4E98-B9AA-BE93A21A58AD),
                                              version(1.0),
                                          ]
                                          library DataTypesLibraryLib
                                          {
                                              importlib("stdole2.tlb");
                                          
                                              typedef
                                              [
                                                  uuid(C15BA150-A8BA-4A10-8C5C-0D65F97A9840),
                                                  version(1.0)
                                              ]
                                          
                                              enum EventTypes
                                              {
                                                  EVENT_UNKNOWN = 0,
                                                  EVENT_FROM_RECIPE = 10000,
                                                  EVENT_START_HISTORICAL_JOB = 10001,
                                                  EVENT_WEB_POSITION_AND_SPEED = 10005,
                                                  EVENT_BLOB_OVERRUN = 10009,
                                                  EVENT_CUT_SIGNAL = 10019,
                                                  EVENT_START_JOB = 10023,
                                                  EVENT_STOP_JOB = 10024,
                                                  EVENT_START_INSPECTION = 10025,
                                                  EVENT_STOP_INSPECTION = 10026,
                                                  EVENT_WEB_EDGE = 10036,
                                                  EVENT_PAUSE_INSPECTION = 10045,
                                                  EVENT_RESTART_INSPECTION = 10046,
                                                  EVENT_JOB_PASSED = 10049,
                                                  EVENT_JOB_FAILED = 10050,
                                                  EVENT_DOFF_PASSED = 10051,
                                                  EVENT_DOFF_FAILED = 10052,
                                                  EVENT_ROLL_PASSED = 10053,
                                                  EVENT_ROLL_FAILED = 10054,
                                                  EVENT_EXTERNAL_RUNNEXTJOB = 10055,
                                                  EVENT_DENSITY_EVENT = 10079,
                                                  EVENT_WET_CAMERA_STATUS = 10180,
                                                  EVENT_WET_START_CALIBRATION = 10181,
                                                  EVENT_WET_STOP_CALIBRATION = 10182
                                              } EventTypes;
                                          
                                              enum CommandTypes
                                              {
                                                  COMMAND_UNINITIALIZED = -1,
                                                  COMMAND_START_JOB = 1,
                                                  COMMAND_STOP_JOB,
                                                  COMMAND_LINEPROFILE_START,
                                                  COMMAND_LINEPROFILE_STOP,
                                                  COMMAND_SNAPIMAGE
                                              };
                                          
                                              [
                                                  uuid(0405e972-093d-4f16-9b4f-f9071cc8f9b2)
                                              ]
                                              coclass EventData
                                              {
                                                  [default] interface IEventData;
                                              };
                                          
                                              [
                                                  uuid(b5736d7e-0d93-4a0f-aa7d-33283e3c9a4e)
                                              ]
                                              coclass FlawData
                                              {
                                                  [default] interface IFlawData;
                                              };
                                          
                                              [
                                                  uuid(B6AFC998-139C-44CE-B431-9CD001774797)
                                              ]
                                              coclass ImageData
                                              {
                                                  [default] interface IImageData;
                                                  interface IStream;
                                              };
                                          
                                              [
                                                  uuid(c6da7cb0-29e5-4df1-be12-ee863daf7797)
                                              ]
                                              coclass LineHardwareData
                                              {
                                                  [default] interface ILineHardwareData;
                                              };
                                          
                                              [
                                                  uuid(635a7140-dda9-4ccc-846a-03314e9ee5dd)
                                              ]
                                              coclass JobData
                                              {
                                                  [default] interface IJobData;
                                              };
                                              [
                                                  uuid(30cbf047-f7ac-43b6-9a7b-5b8edc4ccb45)
                                              ]
                                              coclass JobQueueData
                                              {
                                                  [default] interface IJobQueueData;
                                              };
                                              [
                                                  uuid(B1FB3525-376C-49BD-9F69-7C2E7DC26F2B)
                                              ]
                                              coclass ProductData
                                              {
                                                  [default] interface IProductData;
                                              };
                                              [
                                          		uuid(976cf999-21ad-4302-8165-57ad5bccd3c1)
                                          	]
                                          	coclass CommandData
                                          	{
                                          		[default] interface ICommandData;
                                          	};
                                          	[
                                          		uuid(79cdf1bf-df4f-4720-9bef-b3ed0d3f95a2)
                                          	]
                                          	coclass LaneSetupData
                                          	{
                                          		[default] interface ILaneSetupData;
                                          	};
                                          	[
                                          		uuid(2455df8c-ff78-4434-8560-9df1e62bfaca)
                                          	]
                                          	coclass LaneData
                                          	{
                                          		[default] interface ILaneData;
                                          	};
                                              [
                                                  uuid(f287dc18-74c9-446c-a753-e8e6b18e58f2)
                                              ]
                                              coclass JobLane
                                              {
                                                  [default] interface IJobLane;
                                              };
                                          	[
                                          		uuid(0b4be3c3-f304-4f98-a870-e2933dee5b7e)
                                          	]
                                          	coclass ErrorMessageData
                                          	{
                                          		[default] interface IErrorMessageData;
                                          	};
                                          };
                                          
                                          import "shobjidl.idl";
                                          import "shobjidl.idl";
                                          
                                          1 Reply Last reply
                                          0

                                          13/36

                                          16 Aug 2023, 12:42

                                          • Login

                                          • Login or register to search.
                                          13 out of 36
                                          • First post
                                            13/36
                                            Last post
                                          0
                                          • Categories
                                          • Recent
                                          • Tags
                                          • Popular
                                          • Users
                                          • Groups
                                          • Search
                                          • Get Qt Extensions
                                          • Unsolved