1

我正在尝试使用 COM 对象,但参数类型 VARIANT* 有问题。我可以很好地使用 COM 对象的功能,除非它们具有这种类型的参数。

generateDocumentation 生成的文档是:

QVariantList 参数 = ...

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

根据COM对象提供的文档,参数的类型应该是LONG、LONG、LONG*和VARIANT*,准确的说VARIANT*是指向包含BSTR数组的VARIANT的指针。

我通常应该能够检索第三个和第四个参数(类型为 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: Error calling IDispatch member GetRanges: Unknown error,这不是很有帮助。

我试图改变一些事情,并通过使用以下代码设法取得进展(某种程度):

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 中也不起作用。

4

1 回答 1

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();

希望它可以帮助某人!

于 2013-08-14T09:19:38.073 回答