Это продолжение предыдущего вопроса: 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 = "";
Я искал в Интернете и увидел похожую ошибку, о которой сообщалось на их трекере ошибок. Это пока не исправлено:
Вызов функций через dynamicCall () не возвращает значения по QVariant
Также пост, где у кого-то, похоже, такая же проблема:
Кто-нибудь знает решение / обходной путь?
РЕДАКТИРОВАТЬ:
Оригинальная функция SendCommand(LPCTSTR command,BSTR* ret)
,
Может быть, проблема с тем, как BSTR*
обрабатывается как &QString
?
Вы можете использовать это решение
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();
Смотря на документация, Вы не вызываете функцию правильно. Вы проходите в 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 );