Win8 的拼写检查 API 将空作为参数发送

Win8's Spell Checking API sends null as out param

本文关键字:参数 检查 API Win8      更新时间:2023-10-16

我正在C++中实现一个没有ATL的Windows 8拼写检查COM服务,但是当Windows的msspellcheckinghost.exe调用我的ISpellCheckProviderFactory::SupportedLanguages()时,它会传递nullptr作为out参数,我自然会返回E_POINTER...这会导致失败和事件日志消息:

Failed instantiating third-party spellchecking provider: CLSID {...}, HRESULT 0x80004003.

当我使工厂类和 DLL 加载程序使用 ATL 时,主机会正确调用该函数。这是没有意义的,因为后续的非 ATLEnumString实现被正确使用。那么,为什么工厂可以要求ATL,而之后就不需要呢?

更糟糕的是,我不知道如何将调试器附加到主机,因为msspellcheckinghost.exe没有记录,所以不知道要传递给它什么。

项目源代码可在 https://github.com/TinoDidriksen/spellers/tree/master/win8 - 原型基本上是从Microsoft自己的示例项目中复制的,但我删除了 ATL 部件,因为我希望在运行时从配置文件加载 GUID(该部分有效)。

同样的事情发生在32位OS + DLL上,因此与此无关。

在 MS 论坛的帮助下,问题原来是ISpellCheckProviderFactory不是IClassFactory,DLL 必须返回一个适当的IClassFactory,而该又可以CreateInstance()实际的提供程序工厂。