我正在实现 Windows 8 Spell Checking COM service在没有 ATL 的 C++ 中,但是当 Windows 的 msspellcheckinghost.exe 调用我的 ISpellCheckProviderFactory::SupportedLanguages()
时,它传递 nullptr
作为输出参数,我自然会返回 E_POINTER
...导致失败和事件日志消息:
Failed instantiating third-party spellchecking provider: CLSID {...}, HRESULT 0x80004003.
当我使工厂类和 DLL 加载器使用 ATL 时,主机会正确调用该函数。这是没有意义的,因为正确使用了后续的非 ATL EnumString
实现。那么,为什么工厂需要ATL,而工厂之后却不需要?
更糟糕的是,我不知道如何将调试器附加到主机,因为 msspellcheckinghost.exe
没有记录,所以不知道要传递给它什么。
项目源位于https://github.com/TinoDidriksen/spellers/tree/master/win8。 - 原型(prototype)基本上是从 Microsoft 自己的示例项目中复制的,但我删除了 ATL 部分,因为我希望在运行时从配置文件加载 GUID(该部分有效)。
同样的事情发生在 32 位 OS+DLL 上,所以与此无关。
最佳答案
随着help of MS forums ,问题原来是 ISpellCheckProviderFactory
不是 IClassFactory
,DLL 必须返回一个正确的 IClassFactory
,而 IClassFactory
又可以 CreateInstance()
实际的提供者工厂。
关于c++ - Win8 的拼写检查 API 将 null 作为输出参数发送,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29834762/