visual-c++ - 哪个类型库托管 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 时错过了选择吗?
解决方案
这解决了问题的第一部分,如何找到包含给定接口或类的类型库(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 中并检查要快得多。但在许多情况下,当你刚开始时,这并不明显。
至于问题的第二部分 - 为什么缺少这种依赖关系 - 如果您添加代码的相关部分/包含可能会有所帮助?