我正在使用VS2010和Casablanca 1.2版将REST接口集成到现有的C ++解决方案中。如果我创建一个只有这个代码块的新解决方案,它可以完美地工作。当我将此代码放入现有的.cpp文件时,它会在创建具有memcpy异常的客户端对象时崩溃。我已经完成了属性文件的更新,以查看Casablanca(100)的正确版本,并添加了我的外部依赖项以及include和lib目录的路径。
代码块是:
try
{
http_client_config cimconfig;
cimconfig.set_validate_certificates(false);
http_client cimclient(L"https://dmaid52.corp.global/workplace",cimconfig);
cimclient .request(methods::GET).then([](http_response response) {
string_t theResponse = response.to_string();
}).wait();
}
catch( const http_exception &e )
{
printf("Exception status code %u returned. %s\n", e.error_code(), e.what());
}
创建cimclient时,我得到了异常。如果我删除对配置的引用并且只调用http_client cimclient(L"https://dmaid52.corp.global/workplace")
它似乎工作正常,但它会在.request
上抛出异常。
异常的调用堆栈如下。
msvcr100d.dll!_VEC_memcpy(void * dst, void * src, int len) + 0x46 bytes
cpprest100d_1_2.dll!_wmemcpy() + 0x31 bytes
cpprest100d_1_2.dll!std::char_traits<wchar_t>::copy() + 0x2f bytes
cpprest100d_1_2.dll! std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t> ::assign() + 0xb7 bytes
cpprest100d_1_2.dll! std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t> ::basic_string< wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t> >() + 0x86 bytes
cpprest100d_1_2.dll!web::http::client::credentials::credentials() + 0x67 bytes
cpprest100d_1_2.dll!web::http::client::http_client_config::http_client_config() + 0x6c bytes
cpprest100d_1_2.dll! web::http::client::details::_http_client_communicator::_http_client_communicator() + 0x73 bytes cpprest100d_1_2.dll!web::http::client::details::winhttp_client::winhttp_client() + 0x52 bytes
cpprest100d_1_2.dll!std::tr1::_Ref_count_obj<web::http::client::details::winhttp_client>::_Ref_count_obj<web::http::client::details::winhttp_client><web::http::uri const &,web::http::client::http_client_config const &>() + 0xa6 bytes
cpprest100d_1_2.dll!std::tr1::make_shared<web::http::client::details::winhttp_client,web::http::uri const &,web::http::client::http_client_config const &>() + 0x8f bytes
cpprest100d_1_2.dll!web::http::client::http_network_handler::http_network_handler() + 0x70 bytes
cpprest100d_1_2.dll!std::tr1::_Ref_count_obj<web::http::client::http_network_handler>::_Ref_count_obj<web::http::client::http_network_handler><web::http::uri const &,web::http::client::http_client_config const &>() + 0xa3 bytes
cpprest100d_1_2.dll!std::tr1::make_shared<web::http::client::http_network_handler,web::http::uri const &,web::http::client::http_client_config const &>() + 0x8c bytes
cpprest100d_1_2.dll!web::http::client::http_client::build_pipeline() + 0x6f bytes
cpprest100d_1_2.dll!web::http::client::http_client::http_client() + 0x74 bytes
Hl7.exe!CChartSchedule::sendScheduleToCIM(QMsgSchedule * pMsg) Line 146 + 0x35 bytes C++
我已经搜索了高低,尝试找到这个错误的解决方案但没有用。我认为它可能是项目设置中的某个设置,但我将独立项目与我的集成项目进行了比较,并且无法提出任何建议。
答案 0 :(得分:0)
我已经陷入了非常相似的境地。
在我的情况下,问题出现在casablanca库和目标可执行文件的不同构建设置中。 Casablanca是在一个静态库中构建的,其中一组定义和最终项目使用了其他一组定义。这导致卡萨布兰卡内部结构的大小不同,导致非常奇怪的行为和意想不到的结果。
Visual Studio给了我这个错误:Stack cookie instrumentation code detected a stack-based buffer overrun.
我通过检查项目和卡萨布兰卡项目中的sizeof(http_client_config)
找到了问题的根源。
分辨率很简单 - 在两个项目中设置相同的定义。