我在没有ATL的情况下在C ++中实现Windows 8 Spell Checking COM service,但是当Windows的msspellcheckinghost.exe调用我的ISpellCheckProviderFactory::SupportedLanguages()
时,它将nullptr
作为out param传递给我,我自然会返回E_POINTER
{{ 1}} ...导致失败和事件日志消息:
Failed instantiating third-party spellchecking provider: CLSID {...}, HRESULT 0x80004003.
当我使工厂类和DLL加载器使用ATL时,主机正确调用该函数。这没有任何意义,因为正确使用了后续的非ATL EnumString
实现。那么为什么工厂需要ATL,而不是之后?
更糟糕的是,我不知道如何将调试器附加到主机,因为msspellcheckinghost.exe
没有记录,所以不知道传递给它的是什么。
项目源可以在https://github.com/TinoDidriksen/spellers/tree/master/win8获得 - 原型基本上是从微软自己的示例项目中复制的,但我把ATL部分撕掉了,因为我希望在运行时从配置文件中加载GUID(该部分有效) )。
同样的事情发生在32位OS + DLL上,因此与此无关。
答案 0 :(得分:0)
使用help of MS forums,问题原来是ISpellCheckProviderFactory
不是IClassFactory
,并且DLL必须返回正确的IClassFactory
,而CreateInstance()
可以{{1}} 1}}实际的提供者工厂。