我需要在 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 更好地互操作。
我需要使用 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 更好地互操作。