c++ - Win8 的拼写检查 API 将 null 作为输出参数发送

标签 c++ windows-8 com atl spell-checking

我正在实现 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/

相关文章:

c++ - 考虑到危险,为什么项目使用 -I include 开关?

windows-8 - 是否可以将 Microsoft Kinect SDK 与 Metro Style 应用程序一起使用?

c# - 如何从 Windows 8 中的 KnowFolders 检索文件?

visual-c++ - 如何使用运行对象表 (ROT) 在两个 COM 对象之间进行通信?

c++ - IDISPATCH::Invoke 调用方法失败,错误 0x80020005 类型不匹配

c++ - 当我的计算机中有两个 OpenCV(相同版本)时,如何选择在 CMakeLists.txt 中使用哪个 OpenCV?

c++ - 从其参数之一找到 vector 中的元素

c++ - std::numeric_limits::max 的语法错误

windows-8 - 使用 Webview 下载 Windows 8

delphi - COM Elevation Moniker 在 Vista/Windows 7 下无法提升服务器