首页 > 解决方案 > 哪个类型库托管 stdDataFormat?

问题描述

我正在尝试将 VB6 的VBRUN类型库导入 Visual C++ 2017 头文件,但由于缺少依赖项而失败。

Visual C++ 报告

“错误 C4772:#import 引用了缺失类型库中的类型;‘ missing_type ’用作占位符”

使用 OLE 视图查看文件会发现问题出在DataFormat属性(DataFormat([out, retval] --<GetRefTypeInfo failed>** Return))上。

缺少的依赖项似乎是stdDataFormat:确实驻留在哪个类型库stdDataFormat中,为什么缺少它?(我的操作系统是 Windows 10 Enterprise,21H1。)我在安装 Visual Studio 6 时错过了选择吗?

标签: visual-c++comvb6

解决方案


这解决了问题的第一部分,如何找到包含给定接口或类的类型库(TLB)。


假设您对托管给定 COM 接口或类的 TLB / DLL 没有先入之见,您可以通过几次注册表搜索找到它,假设所讨论的类型实际上已被注册。

我开始HKEY_CLASSES_ROOT搜索数据值 = stdDataFormat。这导致:

[HKEY_CLASSES_ROOT\MSSTDFMT.StdDataFormat]
@="StdDataFormat Object"

[HKEY_CLASSES_ROOT\MSSTDFMT.StdDataFormat\CLSID]
@="{6D835690-900B-11D0-9484-00A0C91110ED}"

现在配备 的 CLSID GUID 6D835690-900B-11D0-9484-00A0C91110ED,搜索该值,找到:

HKEY_CLASSES_ROOT\WOW6432Node\CLSID\{6D835690-900B-11D0-9484-00A0C91110ED

其中对我们来说重要的子元素是:

[HKEY_CLASSES_ROOT\WOW6432Node\CLSID\{6D835690-900B-11D0-9484-00A0C91110ED}\InprocServer32]
@="c:\\windows\\SysWow64\\msstdfmt.dll"
...

InprocServer32价值是我想要找到的主要东西;它告诉你 DLL - 这是c:\windows\SysWow64\msstdfmt.dll(在我的电脑上 - 但这应该是典型的)。

msstdfmt.dll在 OLEView (或OLEViewDotNet )中打开证实了这一点;该 DLL 中 TLB 的反编译 IDL 包含:

[
  uuid(6D835690-900B-11D0-9484-00A0C91110ED),
  helpstring("StdDataFormat Object"),
  helpcontext(0x00066b5f)
]
coclass StdDataFormat {
    [default] interface IStdDataFormatDisp;
    [default, source] dispinterface IStdDataFormatEvents;
};

所以msstdfmt.dll应该是缺少的依赖。

如果您确实怀疑此 DLL,那么显然将其加载到 OLEView 中并检查要快得多。但在许多情况下,当你刚开始时,这并不明显。


至于问题的第二部分 - 为什么缺少这种依赖关系 - 如果您添加代码的相关部分/包含可能会有所帮助?


推荐阅读