在Qt ActiveX中断言“ id <0”失败

时间:2018-10-09 16:34:27

标签: c++ qt com activex

我使用Microsoft Access 2010 ActiveX(COM)制作了一个程序来显示项目(.adp文件)的引用:

Access::Application* app = new Access::Application(nullptr);
app->SetVisible(true);

app->OpenAccessProject("E:\\solulog_dev\\SoluTools\\app\\test\\sources\\utilitaires\\liste_aide.adp", true);

int nb_ref = app->References()->Count();
qDebug().nospace() << nb_ref << " references";

for(int ref_num = 1; ref_num <= nb_ref; ref_num++)
{
    Access::Reference* ref = app->References()->Item(ref_num);
    qDebug().nospace() << "Reference #" << ref_num << " : " << ref->Name() << " (" << ref->Guid() << ") : " << ref->FullPath();
}

app->CloseCurrentDatabase();
app->Quit();

但是在执行时,我得到了正确数量的引用(在这种情况下为5),但是对 any any 属性的 any 调用参考得到相同的错误:

  

调试错误!

     

程序:c:\ Qt \ 5.11.1 \ msvc2015 \ bin \ Qt5Cored.dll

     

模块:5.11.1
  文件:qaxbase.cpp
  线:3763

     

ASSERT:文件qaxbase.cpp中的“ id <0”,行3763

尝试通过QMetaObject访问属性时似乎失败。

每次调用“ References”对象时,我还会收到警告和错误提示。该代码有效(我得到了正确数量的引用),但可能与之相关:

  

CoCreateInstance失败(非注册类)
  QAxBase :: setControl:无法实例化请求的控件{eb106214-9c89-11cf-a2b3-00a0c90542ff}

此CLSID已正确注册,并按预期引用了“ Microsoft.Office.Interop.Access.ReferencesClass”

有人可以帮我这个断言吗?

1 个答案:

答案 0 :(得分:0)

我尝试了完全相同的代码,但直接使用QAxObject,而不是通过使用dumpcpp生成的C ++名称空间:

QAxObject* app = new QAxObject("Access.Application", nullptr);
app->setProperty("Visible", true);

app->dynamicCall("OpenAccessProject(QString, bool)", "E:\\solulog_dev\\SoluTools\\app\\test\\sources\\utilitaires\\liste_aide.adp");

QAxObject* references = app->querySubObject("References");

int nb_ref = references->property("Count").toInt();
qDebug().nospace() << nb_ref << " références";

for(int ref_num = 1; ref_num <= nb_ref; ref_num++)
{
    QAxObject* reference = references->querySubObject("Item(QVariant)", ref_num);
    qDebug().nospace() << "Reference #" << ref_num << " : " << reference->property("Name").toString() << " (" << reference->property("Guid").toString() << ") : " << reference->property("FullPath").toString();
}

app->dynamicCall("CloseCurrentDatabase()");
app->dynamicCall("Quit()");
delete app;

这一次,所有操作均正常。不是错误的实例化错误,我为每个引用获取值...所以我认为这是dumpcpp错误。我应该将此问题报告给Qt吗?