我需要在C ++ REST SDK中调用CoInitialize?

时间:2016-03-09 14:10:59

标签: c++ rest com casablanca

我需要使用REST SDK从一个简单的REST服务器调用一些COM API。它类似于BlackJack sample code

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

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

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

1 个答案:

答案 0 :(得分:1)

默认情况下,C ++ REST SDK中的任务在Windows Threadpool上执行。您可以:

,而不是尝试将线程池线程连接到STA(应该被视为反模式)。
  • 在创建需要调用COM方法的任务时,指定自定义调度程序(从pplx::scheduler_interface派生)。有关接口声明的信息,请参阅pplxinterface.hwindows_scheduler::schedule()内的pplxwin.cpp了解如何在各种Windows风格上实现默认调度程序。
  • 手动将任何COM交互编组到您拥有和控制的线程(并且已调用CoInitialize)。这可能意味着拥有std::function个对象的全局向量,您可以使用通常的mutex / condition_variable舞来保护它。

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