我正在努力将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”文件,但没有的接口描述有包含任何方法。所以我也不能直接使用它。这是正常的吗?
我非常有必要提出任何建议。
答案 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");