我在没有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/