Important: Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

Translating C++ Excel RTD Server (DLL) to Qt ActiveX DLL Server



  • Hi,

    I have a Microsoft Office Excel RTD (real-time data) server in Visual C++ as a DLL (in-process server), and it works fine when I use it in Excel 2016.

    The issue is that I have to integrate it into an already existing Qt5 application (trading platform). The end-goal is to allow traders to import some data into excel and the data (obviously should be updated in near real-time).

    I've looked at this documentation, but it skims over instructions for building the server. I do not need ActiveX controls at least for now (which is sadly what most of the above link focuses on). It will just be a DLL that gives real-time data (on updateNotify()) to the cells that have an RTD call to it. Furthermore, my Qt5 project uses cMake as the build system, as opposed to qMake.

    I don't mind getting a stand-alone Qt5 version of this server up and running first, and then converting it into cMake (shouldn't be too difficult).

    I am having trouble with converting COM objects into Qt-like objects...

    For example:

    struct __declspec(uuid("a43788c1-d91b-11d3-8f39-00c04f3651b8"))
        IRTDUpdateEvent : IDispatch
    {
        //
        // Raw methods provided by interface
        //
    
        virtual HRESULT __stdcall UpdateNotify() = 0;
        virtual HRESULT __stdcall get_HeartbeatInterval(
            /*[out,retval]*/ long* plRetVal) = 0;
        virtual HRESULT __stdcall put_HeartbeatInterval(
            /*[in]*/ long plRetVal) = 0;
        virtual HRESULT __stdcall Disconnect() = 0;
    };
    
    struct __declspec(uuid("ec0e6191-db51-11d3-8f3e-00c04f3651b8"))
        IRtdServer : IDispatch
    {
        //
        // Raw methods provided by interface
        //
    
        virtual HRESULT __stdcall ServerStart(
            /*[in]*/ struct IRTDUpdateEvent* CallbackObject,
            /*[out,retval]*/ long* pfRes) = 0;
        virtual HRESULT __stdcall ConnectData(
            /*[in]*/ long TopicID,
            /*[in]*/ SAFEARRAY** Strings,
            /*[in,out]*/ VARIANT_BOOL* GetNewValues,
            /*[out,retval]*/ VARIANT* pvarOut) = 0;
        virtual HRESULT __stdcall RefreshData(
            /*[in,out]*/ long* TopicCount,
            /*[out,retval]*/ SAFEARRAY** parrayOut) = 0;
        virtual HRESULT __stdcall DisconnectData(
            /*[in]*/ long TopicID) = 0;
        virtual HRESULT __stdcall Heartbeat(
            /*[out,retval]*/ long* pfRes) = 0;
        virtual HRESULT __stdcall ServerTerminate() = 0;
    };
    

    My server is essentially based off of this, with minor differences.

    Any help would be greatly appreciated.