Ms access 工作DLL代码失败,运行时错误13:调试时类型不匹配

Ms 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

这个问题是个难解之谜,仅供专家解答

我们正在使用VisualStudio6为Access开发一个复杂的COM插件。编译时,外接程序工作正常。但是,当我们使用Ctrl-F5将VB6IDE置于调试模式时,Access会抛出

运行时错误13:类型不匹配

尝试将Access
Application.COMAddIns(“AddInName”).Object
引用分配给
AddInName
类型库中公开的类型的早期绑定VBA变量时出错

进一步资料:

  • Access应用程序使用通过调用外接程序创建的对象
  • 外接程序DLL还用作Access VBA引用中包含的类型库
  • 来自外接程序的类型访问请求在
    AddInName
    类型库中定义
在Access VBA中,失败的代码如下所示:

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 ...) 
    
  • C:\ProgramFiles(x86)\Microsoft Visual Studio\VB98\

    VB6.EXE
    LINK.EXE
    
  • 注:

    • 使用管理登录也可能有助于开发VB6应用程序

    • 这是有道理的,因为VB6起源于Windows95时代,当时用户几乎是操作系统实例的主宰


    注意事项:对于具有大量DLL交互的非常复杂的访问表单,这可能不是一个完美的解决方案,但它总比没有好得多

    AddInName.SomeClass实际上是我定义的一种对象类型。我想使用这个特定类型,而不是泛型的
    对象
    类型来对代码进行编译时验证。
    Application.COMAddIns(“AddInName”)
    的类型是
    COMAddIn
    。它有一个.Object属性,允许您将对象(可以是任何对象)传递回主机应用程序。请记住,这一切都适用于编译后的DLL,所以我非常确定这段代码可以正常工作。当我尝试调试时,它失败了。