【问题标题】:Qt ActiveX "Unknown error"Qt ActiveX“未知错误”
【发布时间】:2014-04-09 22:38:14
【问题描述】:

我正在将 T-Cube 电机控制器 (http://www.thorlabs.de/newgrouppage9.cfm?objectgroup_id=2419) 集成到基于 Qt-4.8.1 包的软件中。由于没有手册或任何类型的教程如何检索 ActiveX 对象以及如何调用方法,我做了以下操作。

1) 通过 Windows 注册表查找与电机控制器名称相似的词。找到一个 CLSID 为“{3CE35BF3-1E13-4D2C-8C0B-DEF6314420B3}”的候选人。

2) 尝试通过以下方式对其进行初始化(缩短了提供的代码,删除了所有结果检查以提高可读性):

HRESULT h_result = CoInitializeEx(NULL, COINIT_MULTITHREADED);
pd->moto = new QAxObject();
initialized = moto->setControl( "{3CE35BF3-1E13-4D2C-8C0B-DEF6314420B3}" );
QString stri = browser->generateDocumentation();
obj->dynamicCall("SetHWSerialNum(int)", params);

QVariantList params;
params << 0;
params << 0.0;
int result = pd->moto->dynamicCall("GetPosition(int, double&)", params).toInt();
value = params[1].toFloat();


QVariantList params;
params << 0;
params << dist;
params << dist;
params << true;
int result = pd->moto->dynamicCall("MoveRelativeEx(int, double, double, bool)", params).toInt();

3) generateDocumentation() 方法完美描述了大约 150 种方法。

4) 所有 dynamicCall() 调用都会导致“错误调用...:未知错误”,其中“...”是 generateDocumentation() 给我的列表中 dynamicCall() 的第一个参数。

5) 如果我在 dynamicCall() 中插入未在生成的文档中提供的任何方法,则输出会有所不同。所以我认为生成的文档中的方法确实存在。

6) 如果我使用#import 指令并尝试直接调用以避免使用 QAxObject,我会看到“mg17motor.tlh”文件,但其中描述的接口均不包含任何方法。所以我也不能直接使用它。正常吗?

我非常乐意提供任何建议。

【问题讨论】:

    标签: qt com activex


    【解决方案1】:

    您可以使用 OLE 查看器找到 ActiveX 对象。然后搜索类似的东西 APT..MG..all objects 下。然后找到参数ProgID=MGMOTOR.MGMotorCtrl.1

    现在在 Qt 中不要使用QAxObject,而是使用QAxWidget。然后你会得到类似的东西:

    QAxWidget* aptMotor;
    QVariant chanID = QVariant(0);
    aptMotor = new QAxWidget();
    aptMotor->setControl("MGMOTOR.MGMotorCtrl.1");
    
    //Nice html documentation on available functions
    QFile file("out.html");
    file.open(QIODevice::WriteOnly | QIODevice::Text);
    QTextStream out(&file);
    out << aptMotor->generateDocumentation();
    file.close();
    
    aptMotor->setProperty("HWSerialNum",QVariant(83853493));
    aptMotor->dynamicCall("StartCtrl");
    
    aptMotor->dynamicCall("EnableHWChannel(QVariant)",chanID);
    QThread::sleep(1); // Give it time to enable the channel
    
    double pos(0);
    aptMotor->dynamicCall("SetAbsMovePos(QVariant,QVariant)",chanID,QVariant(pos));
    aptMotor->dynamicCall("MoveAbsolute(QVariant,QVariant,QVariant)",chanID,0);
    
    aptMotor->dynamicCall("StopCtrl");
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-06-27
      • 1970-01-01
      • 2017-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-10
      • 2021-03-11
      相关资源
      最近更新 更多