我正在尝试使用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中也不起作用。
答案 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();
希望它可以帮到某人!