如何使用VARIANT *与dynamicCall?

时间:2013-07-11 14:07:26

标签: c++ qt com qvariant activeqt

我正在尝试使用COM对象,我遇到参数类型VARIANT *的问题。我可以正常使用COM对象的功能,除非他们有这种类型的参数。

generateDocumentation生成的文档是:

QVariantList params = ...

object-> dynamicCall(“GetRanges(int,int,int&,QVariant&)”,params);

根据COM对象提供的文档,参数应为LONG,LONG,LONG *和VARIANT *类型,并且精确地指出VARIANT *是指向包含BSTR数组的VARIANT的指针。 / p>

我通常应该能够检索第三个和第四个参数(类型为LONG *和VARIANT *),并且函数不会使用它们的值。

这是我的代码(a和b是以前初始化的int):

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#中有一个示例演示正常工作。

所以,如果有人知道如何使其有效......

否则我看了一下,看到也可以查询界面并直接使用它,但我不太了解,我不确定它会解决我的问题。

我在Windows7 64位平台上,我使用msvc2012作为编译器。我现在正在使用Qt 5.1.0,但它在5.0.2中也不起作用。

1 个答案:

答案 0 :(得分:1)

我猜你真的不能用dynamicCall做到这一点。 我终于找到了怎么做。这比我想象的要容易。随着Qt的安装,出现了一个名为dumpcpp的工具。它的完整路径是C:\ Qt \ Qt5.1.0x86 \ 5.1.0 \ msvc2012 \ bin \ dumpcpp.exe(显然取决于设置)。您只需将bin文件夹添加到路径中即可使其更易于使用。 然后我进入我的项目文件夹并执行了这个命令:

  

dumpcpp -nometaobject {00062FFF-0000-0000-C000-000000000046}(CLSID仅用于示例,而非我使用的那个)

它会创建一个头文件,您可以将其包含在您尝试使用COM对象的文件中。

在我的案例中,在这个文件中,命名空间(MeasurementLib)中有两个类(IClassMeasurement和ClassMeasurement)。同样,这些名字并不是真实的。

在初始项目文件中,您可以调用所需的函数:

MeasurementLib::ClassMeasurement test; //Do not use IClassMeasurement, you only get write access violations
QVariant rangesVar;
int p1 = 0;
int p2 = 0;
int p3 = 0;
test.getRanges(p1,p2,p3,ranges);
QStringList ranges = ranges.toStringList();

希望它可以帮到某人!