【问题标题】:Which type library hosts stdDataFormat?哪个类型库托管 stdDataFormat?
【发布时间】:2021-12-12 04:11:07
【问题描述】:

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

Visual C++ 报告

“错误 C4772:#import 从缺少的类型库中引用了一个类型; 'missing_type' 用作占位符”

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

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

【问题讨论】:

  • 我刚刚快速扫描了我的 W10 64 位 Windows 文件夹,除了 .NET 文件夹中的几个 Microsoft.VisualBasic.Compatibility.data.dll 文件之外,唯一一个包含该文本字符串是 C:\Windows\SysWOW64 文件夹中的 MSSTDFMT.DLL。文件描述是“Microsoft 标准数据格式化对象 DLL”,该文件也在我的 W7 Windows\System32 文件夹中。两个系统都安装了 VB6。
  • 关于 MSSTDMFMT.DLL 的线索。 Microsoft VB6 support statement 在“支持的运行时文件与您的应用程序一起分发”下列出了此 DLL。所以它是 VB6 运行时的一部分。您是否在 PC 上安装了 Visual Basic 6 IDE?我猜想安装会提供 DLL
  • 确切地说,它也是(至少) Visual Studio Service Pack 6 的一部分,在存档 VS6sp61.cab 中
  • 类型库什么都没有,那里根本没有代码。它们实际上只是预编译源代码的一种形式,是 IDE 或编译器的输入。

标签: visual-c++ com vb6


【解决方案1】:

这解决了问题的第一部分,如何找到包含给定接口或类的类型库 (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}"

现在配备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 中并检查会快得多。但在许多情况下,当您刚开始时,这并不明显。


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

【讨论】:

  • 代码是#import "MSVBVM60.DLL" tlbid(3)。不应该自动找到依赖吗?
  • 我认为 MSVBVM60.DLL 实际上并不依赖于 MSSTDFMT。在它的 TLB 中,没有提到它,也没有提到 StdDataFormat。相比之下,MSVBVM60 确实依赖于 STDOLE(例如),并且在 TLB 中显示为importlib("stdole2.tlb")。 MSSTDFMT 没有等价物。
  • 我悲伤的那一行在 MSVBVM60 IDL 中显示为“HRESULT DataFormat([out, retval] ** Return);”。
  • RJ 当我查看 MSVBVM60 的 TLB 时,我没有看到任何包含“DataFormat”的内容。我正在查看 SysWOW64 中的文件。它是 6.0.98.48 版本。
  • BTW 您是否尝试手动导入 MSSTDFMT DLL?
猜你喜欢
  • 2019-07-14
  • 1970-01-01
  • 2012-04-14
  • 1970-01-01
  • 1970-01-01
  • 2011-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多