【问题标题】:Connecting QAxObject event with a parameter of type IDispatch*使用 IDispatch* 类型的参数连接 QAxObject 事件
【发布时间】:2016-07-25 05:05:46
【问题描述】:

我正在尝试使用 ActiveQt 库来处理具有 IDispatch* 类型参数的 ActiveX 事件,例如在 idl 文件中。

// ...
library RecognitionClientLib
{
    importlib("stdole2.tlb");
    [
        uuid(XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX),
        helpstring("_IIFactoryEvents Interface")
    ]
    dispinterface _IIRecognizerFactoryEvents
    {
        properties:
        methods:
            [id(1), helpstring("method OnError")] void OnError(
                [in] LONG ilOperationCode,
                [in] BSTR iszDescription
                );
            [id(2), helpstring("method OnResult")] void OnResult(
                [in] IDispatch* ilpSource,
                [in] LONG ilOperationCode
                );
    };
    [
        uuid(XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX),
        control,
        helpstring("IFactory Class")
    ]
// ...

我使用了 dumpcpp.exe 并为对象生成了一个头文件和一个 cpp 文件。 生成的文件跳过了事件生成,如头文件所示:

// skipping event interface _IIFactoryEvents

根据文档,IDispatch* 参数应转换为“QAxBase::asVariant()”。因此,我尝试将事件连接如下:

ClientLib::IFactory* lpFactory(new ClientLib::IFactory());
bool lbOk(connect(
    lpFactory,
    SIGNAL(OnError(
        int,
        const QString&
        )),
    SLOT(onError(
            int,
            const QString&
        ))
    ));
assert(lbOk);
lbOk = connect(
    lpFactory,
    SIGNAL(OnResult(
        QVariant,
        int
        )),
    SLOT(onResult(
        QVariant,
        int
        ))
    );
assert(lbOk);

连接 OnError 的信号没有问题,但 OnResult 的连接失败

Object::connect: 没有这样的信号 ClientLib::IFactory::OnResult(QAxObject*,int)

请帮我看看我应该为 IDispatch* 类型的参数使用什么参数类型?

非常感谢!

【问题讨论】:

  • Nitpick:应该从传递给连接的信号/插槽签名中删除 const 引用以及空格 - 这可以节省一些运行时间,因为 Qt 不必规范化签名。因此bool lbOk = connect(lpFactory, SIGNAL(OnError(int,QString)), SLOT(onError(int,QString)));.
  • 感谢您的建议。我会改变它们。 :)

标签: c++ qt com activeqt


【解决方案1】:

我发现参数类型应该是 IDispatch* 没有修改,尽管文档说它是 QAxBase::asVariant() for in parameter of type IDispatch*.

【讨论】:

  • 干得好。如果您可以将其作为文档错误提交给 Qt bugtracker,那就太好了。
【解决方案2】:

请帮我看看我应该为参数使用什么参数类型 IDispatch* 类型的?

IDispatch* 映射到 QAxObject*: http://doc.qt.io/qt-5/qaxbase.html

【讨论】:

  • 感谢您详尽的回答。但是我的问题是我应该使用什么信号的签名。我无法从上面的回复中找出答案。 :(我已经挖掘并发现参数应该是“IDispatch *”的类型。断言通过了。谢谢。
猜你喜欢
  • 1970-01-01
  • 2021-10-15
  • 1970-01-01
  • 2018-04-25
  • 1970-01-01
  • 1970-01-01
  • 2021-05-17
  • 2022-07-08
  • 2021-06-30
相关资源
最近更新 更多