Win8 的拼写检查 API 将 null 作为输出参数发送
Win8's Spell Checking API sends null as out param
我在没有 ATL 的 C++ 中实现 Windows 8 Spell Checking COM service,但是当 Windows' msspellcheckinghost.exe 调用我的 ISpellCheckProviderFactory::SupportedLanguages()
时,它传递 nullptr
作为输出参数,我自然 return E_POINTER
...导致失败和事件日志消息:
Failed instantiating third-party spellchecking provider: CLSID {...}, HRESULT 0x80004003.
当我使工厂 class 和 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 必须 return 是正确的 IClassFactory
反过来可以 CreateInstance()
实际的提供者工厂。
我在没有 ATL 的 C++ 中实现 Windows 8 Spell Checking COM service,但是当 Windows' msspellcheckinghost.exe 调用我的 ISpellCheckProviderFactory::SupportedLanguages()
时,它传递 nullptr
作为输出参数,我自然 return E_POINTER
...导致失败和事件日志消息:
Failed instantiating third-party spellchecking provider: CLSID {...}, HRESULT 0x80004003.
当我使工厂 class 和 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 必须 return 是正确的 IClassFactory
反过来可以 CreateInstance()
实际的提供者工厂。