【发布时间】:2019-03-14 12:00:40
【问题描述】:
我使用 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断言:文件 qaxbase.cpp 中的“id
尝试通过 QMetaObject 访问属性时似乎失败了。
每次调用“References”对象时,我都会收到一条警告,然后是一个错误。该代码有效(我得到了正确数量的引用),但也许它是相关的:
CoCreateInstance 失败(Classe non enregistrée)
QAxBase::setControl:请求的控制 {eb106214-9c89-11cf-a2b3-00a0c90542ff} 无法实例化
此 CLSID 已正确注册并按预期引用“Microsoft.Office.Interop.Access.ReferencesClass”
谁能帮我做这个断言?
【问题讨论】:
-
检查 Access 组件的注册位数与您的程序相同(32 位与 64 位注册表)
-
已检查,CLSID 已在 32 位和 64 位注册表中注册。就像我说的,“app->References()->count()”和每个引用的“Item(...)”调用一样效果很好
-
然而来自 CoCreateInstance 的错误告诉我们 CLSID eb106214-9c89-11cf-a2b3-00a0c90542ff 未注册。 .NET 事物中的“Microsoft.Office.Interop.Access.ReferencesClass”,而不是“纯”Access 事物,这正常吗?你为什么使用.NET?您可以使用 sysinternals 中的 procmon 之类的工具来检查您的应用使用了哪些注册表路径。
-
我不知道 ActiveX / COM 内部。这是我在 RegEdit 中得到的(关键路径:HKEY_CLASSES_ROOT\CLSID\{EB106214-9C89-11CF-A2B3-00A0C90542FF}\InprocServer32\14.0.0.0):i.stack.imgur.com/sywNY.png
-
如果您在 64 位操作系统上运行,这只是 64 位注册表(另外,您为什么要引用 .NET 互操作类?)