我需要在 C++ REST SDK 的什么地方调用 CoInitialize?

Where do I need to call CoInitialize in the C++ REST SDK?

我需要使用 REST SDK. It's similar to the BlackJack sample code.

从简单的 REST 服务器调用一些 COM API

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

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

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

C++ REST SDK 中的任务默认在 Windows 线程池上执行。您可以:

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

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