【问题标题】:How to use VARIANT* with dynamicCall?如何将 VARIANT* 与 dynamicCall 一起使用?
【发布时间】:2013-07-09 20:33:18
【问题描述】:

我正在尝试使用 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 中也不起作用。

【问题讨论】:

    标签: c++ qt com qvariant activeqt


    【解决方案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();
    

    希望它可以帮助某人!

    【讨论】:

    • 我试过这个方法。它适用于字符串,但不适用于应该由控件填充的变体。我收到与您收到的相同错误消息“调用 IDispatch 成员 GetRanges 时出错:未知错误”
    猜你喜欢
    • 2017-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-21
    • 2021-01-02
    • 2011-07-29
    • 1970-01-01
    相关资源
    最近更新 更多