工作 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 应用程序使用通过调用加载项创建的对象
- 加载项 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
,则作业有效。如果你在有问题的行上设置了一个中断,你可以在 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权限设置为管理员!我试过了,瞧,调试成功了。
对于以下每个可执行文件,右键单击“属性”、“配置”,然后以管理员身份检查运行此程序:
办公路径:
MSACCESS.EXE (or EXCEL.EXE or WINWORD.EXE ...)
C:\Program Files (x86)\Microsoft Visual Studio\VB98\
VB6.EXE
LINK.EXE
备注:
使用管理登录可能也有助于开发 VB6 应用程序。
这是有道理的,因为 VB6 始于 Windows 95 时代,当时用户几乎是他们 OS 实例的国王。
警告:对于具有大量 DLL 交互的非常复杂的 Access 表单,这可能不是一个完美的解决方案,但总比没有好得多!
本题难解难分,专家答疑。
我们正在使用 Visual Studio6 开发复杂的 COM 加载项以供访问。编译后,加载项工作正常。但是,当我们使用 Ctrl-F5 将 VB6 IDE 置于调试模式时,Access 会抛出一个
Run-time error 13: Type mismatch
尝试将 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
,则作业有效。如果你在有问题的行上设置了一个中断,你可以在 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权限设置为管理员!我试过了,瞧,调试成功了。
对于以下每个可执行文件,右键单击“属性”、“配置”,然后以管理员身份检查运行此程序:
办公路径:
MSACCESS.EXE (or EXCEL.EXE or WINWORD.EXE ...)
C:\Program Files (x86)\Microsoft Visual Studio\VB98\
VB6.EXE LINK.EXE
备注:
使用管理登录可能也有助于开发 VB6 应用程序。
这是有道理的,因为 VB6 始于 Windows 95 时代,当时用户几乎是他们 OS 实例的国王。
警告:对于具有大量 DLL 交互的非常复杂的 Access 表单,这可能不是一个完美的解决方案,但总比没有好得多!