工作 DLL 代码失败,出现 运行-时间错误 13:调试时类型不匹配

Working DLL code fails with Run-time error 13: Type mismatch when debugging

本题难解难分,专家答疑。

我们正在使用 Visual Studio6 开发复杂的 COM 加载项以供访问。编译后,加载项工作正常。但是,当我们使用 Ctrl-F5 将 VB6 IDE 置于调试模式时,Access 会抛出一个

Run-time error 13: Type mismatch

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

更多信息:

在 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,则作业有效。如果你在有问题的行上设置了一个中断,你可以在 Immediate window:

中做这样的事情
? TypeName(objSomeClass)
AddInName.SomeClass
? TypeOf objSomeClass Is AddInName.SomeClass
False 

所以说objSomeClass的class名字是"AddInName.SomeClass",但是不是类型的AddInName.SomeClass ].疯狂!

此外,如果您输入的代码公开访问端引用的 CLSID 和源自加载项的对象,它们 return 相同 GUID !那么为什么 VBA 抱怨类型不同呢?

有没有人知道这里发生了什么?如果有任何帮助,我将不胜感激。

我猜(我不是专家)这是因为 AddInName.SomeClass 不是一个对象,它是 AddinName.SomeClass 类型。将 .Object 从 Application.COMAddIns("AddInName").Object 中删除,我认为它会工作得很好。如果您需要它作为代码中其他地方的对象,请将您的 AddInName.SomeClass 类型更改为 Object 并将 .Object 保留在 Application.COMAddIns("AddInName").Object 上,它应该可以工作。

所以我的一位同事偶然发现了答案:将Access和VB6权限设置为管理员!我试过了,瞧,调试成功了。

对于以下每个可执行文件,右键单击“属性”、“配置”,然后以管理员身份检查运行此程序:

  1. 办公路径:

    MSACCESS.EXE (or EXCEL.EXE or WINWORD.EXE ...) 
    
  2. C:\Program Files (x86)\Microsoft Visual Studio\VB98\

    VB6.EXE
    LINK.EXE
    

备注:

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

  • 这是有道理的,因为 VB6 始于 Windows 95 时代,当时用户几乎是他们 OS 实例的国王。

警告:对于具有大量 DLL 交互的非常复杂的 Access 表单,这可能不是一个完美的解决方案,但总比没有好得多!