gpt4 book ai didi

c++ - 如何将 VARIANT* 与 dynamicCall 一起使用?

转载 作者:太空宇宙 更新时间:2023-11-04 11:52:25 24 4
gpt4 key购买 nike

我正在尝试使用 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# 示例演示可以正常工作。

因此,如果有人对如何让它发挥作用有任何想法......

另外看了一圈,也可以直接查询接口(interface)直接使用,但不是很懂,不确定能不能解决我的问题。

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

最佳答案

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

dumpcpp -nometaobject {00062FFF-0000-0000-C000-000000000046} (the CLSID is just for the example, not the one I used)

它会创建一个头文件,您可以将其包含在您尝试使用 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();

希望对大家有帮助!

关于c++ - 如何将 VARIANT* 与 dynamicCall 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17595606/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com