Проблемы со статически связанными библиотеками с CAPL Dll, - PullRequest
0 голосов
/ 31 октября 2019

Может ли кто-нибудь предложить использование обратных вызовов, которые не блокируют измерение 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;
}

Я создал консольное приложение, и эта же функция отлично работает

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...