Win8 的拼写检查 API 将空作为参数发送
Win8's Spell Checking API sends null as out param
我正在C++中实现一个没有ATL的Windows 8拼写检查COM服务,但是当Windows的msspellcheckinghost.exe调用我的ISpellCheckProviderFactory::SupportedLanguages()
时,它会传递nullptr
作为out参数,我自然会返回E_POINTER
...这会导致失败和事件日志消息:
Failed instantiating third-party spellchecking provider: CLSID {...}, HRESULT 0x80004003.
当我使工厂类和 DLL 加载程序使用 ATL 时,主机会正确调用该函数。这是没有意义的,因为后续的非 ATLEnumString
实现被正确使用。那么,为什么工厂可以要求ATL,而之后就不需要呢?
更糟糕的是,我不知道如何将调试器附加到主机,因为msspellcheckinghost.exe
没有记录,所以不知道要传递给它什么。
项目源代码可在 https://github.com/TinoDidriksen/spellers/tree/master/win8 - 原型基本上是从Microsoft自己的示例项目中复制的,但我删除了 ATL 部件,因为我希望在运行时从配置文件加载 GUID(该部分有效)。
同样的事情发生在32位OS + DLL上,因此与此无关。
在 MS 论坛的帮助下,问题原来是ISpellCheckProviderFactory
不是IClassFactory
,DLL 必须返回一个适当的IClassFactory
,而该又可以CreateInstance()
实际的提供程序工厂。
相关文章:
- 如何检查给定的参数是否为 cv::noArray()?
- 用于检查值是否为其任何参数的帮助程序函数
- 模板化检查是否存在带有参数列表的类成员函数?
- SFINAE 检查模板参数运算符
- 检查两个模板参数是否相同
- 使用参数包自动执行dynamic_cast检查
- 检查类是否具有模板专用化(使用布尔值或 int 等模板参数)
- 为什么 std::bind 静态类型检查传递给函数的参数?
- 如何检查参数包是否具有执行顺序中的确切类型
- C++编译时检查是否可以用某种类型的参数调用重载函数
- 如何检查模板参数是否为给定值?
- 在编译时检查未实例化的类模板是否继承自其第一个模板参数
- C ++回测问题:如何检查构造函数在假定失败时是否失败(给定输入的无效参数)
- 如何在 C++ 中检查类构造函数中的参数大小
- 检查模板类型 T 是否为 C++17 中的可变参数包的一部分
- 递归回文检查,不使用向量、大小或其他参数
- 空参数检查C++
- 创建别名时静态断言模板参数检查
- 参数检查
- 通过main传递参数-检查输入是否有效