2

我需要使用REST SDK从简单的 REST 服务器调用一些 COM API 。它类似于BlackJack 示例代码

每当我尝试创建 COM 对象时,我都会得到一个CoInitialize未被调用的异常。但是我究竟可以在哪里初始化处理 REST 请求的线程呢?我找不到任何文档。

我尝试了构造函数(示例中的 BlackJackDealer),但这不起作用:

BlackJackDealer::BlackJackDealer(utility::string_t url) : m_listener(url)
{
  CoInitialize(0);
  ...
}
4

1 回答 1

1

默认情况下,C++ REST SDK 中的任务在 Windows 线程池上执行。与其尝试将线程池线程连接到 STA(应被视为反模式),您可以:

  • pplx::scheduler_interface在创建需要调用 COM 方法的任务时指定自定义调度程序(派生自)。参见pplxinterface.h接口声明和windows_scheduler::schedule()内部pplxwin.cpp如何在各种 Windows 风格上实现默认调度程序。
  • 手动将任何 COM 交互编组到您拥有和控制(并已调用CoInitialize)的线程。这可能意味着像拥有一个全局std::function对象向量,您可以通过通常的mutex/condition_variable舞蹈来保护这些对象。

即使您使用自定义调度程序路线,您也可能需要执行手动编组,但自定义调度程序将与现有的基于任务的 API 更好地互操作。

于 2016-03-28T22:12:33.097 回答