我在没有ATL的C ++中实现了Windows 8 Spell Checking COM service,但是当Windows的msspellcheckinghost.exe调用我的ISpellCheckProviderFactory::SupportedLanguages()时,它将nullptr作为out参数传递,我自然返回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处-原型基本上是从Microsoft自己的示例项目复制而来的,但是我撕掉了ATL部件,因为我希望在运行时从配置文件中加载GUID(该部件有效)。

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

最佳答案

使用help of MS forums时,问题出在是ISpellCheckProviderFactory不是IClassFactory,并且DLL必须返回正确的IClassFactory,而该CreateInstance()进而可以实际的提供程序工厂。

关于c++ - Win8的Spell Checking API发送null作为out参数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29834762/

10-12 05:54