【问题标题】:Qt ActiveX dynamicCall return value always emptyQt ActiveX dynamicCall 返回值始终为空
【发布时间】:2013-02-18 21:28:43
【问题描述】:

这是对上一个问题的跟进:Qt ActiveX

我正在尝试在我的程序中使用 ActiveX 控件。

QAxWidget* mAX = new QAxWidget();
mAX->setControl("{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}");

我知道有一个类似下面的函数(使用getDocumentation()):

SendCommand(QString input, QString& output)

但是当我尝试执行它时:

QString returString;
mAX->dynamicCall("SendCommand(QString,QString&)","something",returnString);

我总是得到:

returString = "";

我在网上搜索了一个类似的错误,并在他们的错误跟踪器上报告了该错误。它似乎还没有修复:

Calling functions through dynamicCall() don't return values by QVariant

还有一篇似乎有人遇到同样问题的帖子:

QAxObject and dynamicCall

有人知道解决方案/解决方法吗?

编辑:

原来的函数是SendCommand(LPCTSTR command,BSTR* ret)

BSTR* 作为&QString 处理的方式可能存在问题?

【问题讨论】:

    标签: c++ qt activex qstring bstr


    【解决方案1】:

    你可以使用这个解决方案

    QString strRetVal;
    QVariant returnValue("");
    QVariant param1("something");
    QList<QVariant> inplist;
    inplist<<param1;
    inplist<<returnValue;
    mAX->dynamicCall("SendCommand(QString,QString&)",inplist );
    strRetVal=inplist.at(1).toString();
    

    【讨论】:

    • 为什么要把参数打包到inplist中再解包呢?我看到它工作得更好,但我不明白为什么。我在上面尝试了@thomas 解决方案,但未设置返回字符串值。当值被打包到 inplist 中时,dynamicCall 可以设置 QString 值,但不能设置 QStringList 值。 QStringList 值仍未设置,我收到错误消息“QAxBase:调用 IDispatch 成员 GetPorts 时出错:未知错误”
    【解决方案2】:

    通过查看documentation,您没有正确调用该函数。您传入的是QString,但该函数采用QVariant。由于QVariant 没有显式构造函数(按设计),因此会创建一个临时QVariant 并将其传递给dynamicCall。因此,您的 returnValue 不会得到更新。

    QVariant dynamicCall( const char * function, const QVariant & var1 = QVariant(), ...
                        , const QVariant & var8 = QVariant() )
    

    我认为,当您改用 QVariant 时,一切都会奏效。

     QVariant returnValue;
     mAX->dynamicCall("SendCommand(QString,QString&)", "something", returnValue );
    

    【讨论】:

    • 感谢您的建议,但它不起作用。我已经试过了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-29
    • 2020-01-02
    • 2012-07-30
    • 2018-11-04
    相关资源
    最近更新 更多