Может ли кто-нибудь предложить использование обратных вызовов, которые не блокируют измерение CANoe?
Итак, у меня возникают проблемы, когда я пытаюсь статически связать библиотеки и создать CAPL DLL. Я связался с VECTOR, но поддержка недоступна.
Я попытался включить CAPL Dll следующими способами:
- Сетевой узел CAPL '#pragma library ("путь к файлу")'
- «Файл >> Параметры >> Программирование >> CAPL DLL >> Настройка моделирования / Настройка теста»
- «Файл >> Параметры >> Программирование >> CAPL DLL >> Настройка измерения»
- Тестовый модуль CAPL с использованием '#pragma library ("file path") "
Я создал DLL для 32-битной системы на 64-битной машине с Windows 10, пробовал с VS2017и VS2019.
Использование статической библиотеки CPP REST
Я правильно установил Casablanca SDK для использования в Visual Studio 2017, как определено здесь: https://stackoverflow.com/a/44910349/1919873
Затем я создал CAPL DLL со статической связью cpprest140_2_5.lib
, ошибок компиляции нет, и DLL можно использовать в CAPL. Теперь, когда я вызываю функции с GET request
в DLL внутри CAPL, все работает без проблем. Но когда я вызываю функцию с POST Request
, упомянутым ниже, как только я добавляю данные JSON
в request
, я получаю это Runtime Kernel error
и ошибку System Distributed simulation environment: The connection is broken!
, тогда симуляция нарушается и падает. У меня проблема только при добавлении Json
в запросе, если я удаляю JSON
из запроса, то все работает нормально и я получаю ответ 400 Bad requests
с сервера.
web::json::value rest_method_post(uint32 handle,http_client client, web::json::value json_v)
{
CaplInstanceData* inst = GetCaplInstanceData(handle);
inst->DllInfo("DLL: rest_method_post:");
web::json::value json;
try
{
client
.request(web::http::methods::POST, U("/"), json_v) // Here adding JSON results in Runtime error
.then([&](const web::http::http_response& response) {
inst->DllInfo(const_cast<char*>(utility::conversions::to_utf8string(response.to_string().c_str()).c_str()));
json = response.extract_json().get();
}).wait();
}
catch (exception& e)
{
inst->DllInfo("DLL: post Exception occured!");
inst->DllInfo((char*)e.what());
}
return json;
}
Я создал консольное приложение, и эта же функция прекрасно работает.
Использование lib curl
Я попытался связаться с другой библиотекой, чтобы выполнить работу! К сожалению, такая же ошибка существует и здесь!
Я правильно установил lib curl 7.67.0 для использования в Visual Studio 2017, как определено здесь: https://stackoverflow.com/a/54680718/1919873
Затем я создал CAPL DLLсо статически связанной библиотекой CURL ошибок компиляции нет, и DLL может использоваться в CAPL. Теперь, когда я вызываю другие функции в DLL внутри CAPL, все работает, у меня нет проблем. Но когда я вызываю функцию, упомянутую ниже, чтобы использовать библиотеку CURL, как только она достигает curl_global_init()
или curl_easy_init();
, я получаю Runtime Kernel error
и ошибку System Distributed simulation environment: The connection is broken!
, тогда симуляция нарушается и вылетает.
unsigned int CAPLEXPORT far CAPLPASCAL Rest_UsersLogin_new(uint32 handle)
{
CaplInstanceData* inst = GetCaplInstanceData(handle);
if (inst == NULL)
{
return -1;
}
try
{
inst->DllInfo("Request POST"); //
CURL* curl;
CURLcode res;
struct curl_slist* slist1;
std::string data = "{\"userName\": \"xAS344yn\",\"userPassword\" : \"TjRFWFJQKRUAxyZGQxMjMj\"}";
curl_global_init(CURL_GLOBAL_DEFAULT); // this step results in Runtime error
curl = curl_easy_init(); // this step results in Runtime error
std::string s;
if (curl)
{
slist1 = NULL;
slist1 = curl_slist_append(slist1, "Content-Type: application/json");
curl_easy_setopt(curl, CURLOPT_URL, "https://localhost:61000/users/login");
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L); //only for https
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L); //only for https
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, data.c_str());
curl_easy_setopt(curl, CURLOPT_USERAGENT, "curl/7.38.0");
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, CurlWrite_CallbackFunc_StdString);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &s);
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, slist1);
curl_easy_setopt(curl, CURLOPT_MAXREDIRS, 50L);
curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "POST");
curl_easy_setopt(curl, CURLOPT_TCP_KEEPALIVE, 1L);
//curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L); //remove this to disable verbose output
/* Perform the request, res will get the return code */
res = curl_easy_perform(curl);
/* Check for errors */
if (res != CURLE_OK)
{
inst->DllInfo((char*)curl_easy_strerror(res));
}
/* cleanup */
curl_easy_cleanup(curl);
}
inst->DllInfo(const_cast<char*>(s.c_str()));
//inst->DllInfo(const_cast<char*>(utility::conversions::to_utf8string(response.to_string().c_str()).c_str()));
}
catch (const std::exception & e)
{
inst->DllInfo("DLL: post Exception occured!");
inst->DllInfo((char*)e.what());
}
return 1;
}
Я создал консольное приложение, и эта же функция отлично работает