Qt ActiveX“未知错误”

时间:2014-03-07 00:14:55

标签: qt com activex

我正在努力将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”文件,但没有的接口描述有包含任何方法。所以我也不能直接使用它。这是正常的吗?

我非常有必要提出任何建议。

1 个答案:

答案 0 :(得分:0)

您可以使用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");