Ms access 工作DLL代码失败,运行时错误13:调试时类型不匹配
这个问题是个难解之谜,仅供专家解答 我们正在使用VisualStudio6为Access开发一个复杂的COM插件。编译时,外接程序工作正常。但是,当我们使用Ctrl-F5将VB6IDE置于调试模式时,Access会抛出 运行时错误13:类型不匹配 尝试将AccessMs access 工作DLL代码失败,运行时错误13:调试时类型不匹配,ms-access,vb6,vba,office-addins,Ms Access,Vb6,Vba,Office Addins,这个问题是个难解之谜,仅供专家解答 我们正在使用VisualStudio6为Access开发一个复杂的COM插件。编译时,外接程序工作正常。但是,当我们使用Ctrl-F5将VB6IDE置于调试模式时,Access会抛出 运行时错误13:类型不匹配 尝试将AccessApplication.COMAddIns(“AddInName”).Object引用分配给AddInName类型库中公开的类型的早期绑定VBA变量时出错 进一步资料: Access应用程序使用通过调用外接程序创建的对象 外接程序D
Application.COMAddIns(“AddInName”).Object
引用分配给AddInName
类型库中公开的类型的早期绑定VBA变量时出错
进一步资料:
- Access应用程序使用通过调用外接程序创建的对象
- 外接程序DLL还用作Access VBA引用中包含的类型库
- 来自外接程序的类型访问请求在
类型库中定义AddInName
Public Function GetAddInRef As AddInName.SomeClass
Dim objSomeClass As AddInName.SomeClass
' .Object is set to a SomeClass instance in IDTExtensibility2_OnConnection
Set objSomeClass = Application.COMAddIns("AddInName").Object ' => Error 13!
Set GetAddInRef = objSomeClass
End Function
如果将objSomeClass
的类型更改为Object
,则赋值有效。如果在有问题的行上设置了一个中断,则可以在即时窗口中执行以下操作:
? TypeName(objSomeClass)
AddInName.SomeClass
? TypeOf objSomeClass Is AddInName.SomeClass
False
所以说,
objSomeClass
的类名是“AddInName.SomeClass”,但它不是AddInName.SomeClass
类型的。疯狂
此外,如果您输入的代码公开了访问端引用的CLSID和源于外接程序的对象,它们都返回相同的GUID!那么为什么VBA抱怨类型不同呢
有人知道这里发生了什么吗?如果有任何帮助,我将不胜感激。我猜(我不是专家)这是因为AddInName.SomeClass不是对象,而是AddInName.SomeClass类型。将.Object从Application.COMAddIns(“AddInName”).Object中删除,我认为它可以正常工作。如果您需要它作为代码中其他地方的对象,那么将AddInName.SomeClass类型更改为object,并将.object保留在Application.COMAddIns(“AddInName”).object上,它应该可以工作 所以我的一位同事偶然发现了答案:将访问权限和VB6权限设置为管理员!我试过了,瞧,调试成功了 对于以下每个可执行文件,右键单击“属性”、“配置”,然后选中“以管理员身份运行此程序”:
MSACCESS.EXE (or EXCEL.EXE or WINWORD.EXE ...)
VB6.EXE
LINK.EXE
- 使用管理登录也可能有助于开发VB6应用程序
- 这是有道理的,因为VB6起源于Windows95时代,当时用户几乎是操作系统实例的主宰
注意事项:对于具有大量DLL交互的非常复杂的访问表单,这可能不是一个完美的解决方案,但它总比没有好得多
AddInName.SomeClass实际上是我定义的一种对象类型。我想使用这个特定类型,而不是泛型的对象
类型来对代码进行编译时验证。Application.COMAddIns(“AddInName”)
的类型是COMAddIn
。它有一个.Object属性,允许您将对象(可以是任何对象)传递回主机应用程序。请记住,这一切都适用于编译后的DLL,所以我非常确定这段代码可以正常工作。当我尝试调试时,它失败了。