哪个类型库托管 stdDataFormat?

Which type library hosts stdDataFormat?

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

Visual C++ 报告

"error C4772: #import referenced a type from a missing type library; 'missing_type' used as a placeholder"

使用 OLE 视图查看文件显示问题出在 DataFormat 属性 (DataFormat([out, retval] --<GetRefTypeInfo failed>** Return)).

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

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


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

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

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

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

现在使用 6D835690-900B-11D0-9484-00A0C91110ED 的 CLSID GUID,搜索该值,发现:

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(在我的电脑上 - 但这应该是典型的)。

在 OLEView(或 OLEViewDotNet)中打开 msstdfmt.dll 确认了这一点;该 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 中并进行检查显然要快得多。但在很多情况下,刚开始时这并不明显。


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