Я пытаюсь использовать COM-объект, и у меня проблема с типом параметра VARIANT*. Я могу прекрасно использовать функции COM-объекта, за исключением случаев, когда у них есть параметр этого типа.
Документ, созданный generateDocumentation:
Параметры QVariantList = ...
object->dynamicCall("GetRanges(int,int,int&, QVariant&)", params);
Согласно документу, предоставленному с COM-объектом, параметры должны иметь тип LONG, LONG, LONG* и VARIANT*, и уточняется, что VARIANT* является указателем на VARIANT, содержащий массив BSTR.
Обычно я должен иметь возможность получить третий и четвертый параметры (типа LONG* и VARIANT*), и их значения не используются функцией.
Вот мой код (a и b предварительно инициализированы):
QStringList sl;
QVariantList params;
int i = -1;
params << QVariant (a);
params << QVariant (b);
params << QVariant (i);
params << QVariant (sl);
comobject->dynamicCall("GetRanges(int,int,int&,QVariant&)",params);
sl = params[3].toStringList();
i = param[2].toInt();
Теперь с этим кодом все, что я получаю, это ошибка QAxBase: Ошибка при вызове члена IDispatch GetRanges: Неизвестная ошибка, что не очень полезно.
Я попытался изменить некоторые вещи, и мне удалось продвинуться (вроде) с помощью этого кода:
QStringList sl;
QVariant v = qVariantFromValue(sl);
QVariantList params;
int i = -1;
params << QVariant (a);
params << QVariant (b);
params << QVariant (i);
params << qVariantFromValue((void*)&v);
comobject->dynamicCall("GetRanges(int,int,int&,QVariant&)",params);
sl = params[3].toStringList();
i = param[2].toInt();
Это избавляет от ошибки, и значение i в конце правильное, но sl по-прежнему пуст. И я знаю, что этого не должно быть, потому что у меня есть образец демо на C#, который работает правильно.
Так что, если у кого-то есть идея, как заставить его работать...
В противном случае я немного осмотрелся и увидел, что также можно запросить интерфейс и использовать его напрямую, но я мало что понял и не уверен, что это решит мои проблемы.
Я работаю на 64-битной платформе Windows7 и использую msvc2012 в качестве компилятора. Сейчас я использую Qt 5.1.0, но и в 5.0.2 это не сработало.