Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
Марсианин)))
713 / 46 / 15
Регистрация: 18.07.2010
Сообщений: 637

Ошибка выполнения libcurl в потоке при динамическом подключении

04.01.2015, 23:28. Показов 2111. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всех С новым годом.


Имею функцию
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
bool __fastcall TForm3::PostHesh(AnsiString Hesh)
{
  CURL *curl;
  CURLcode res;
  UnicodeString contep;
  TStringList *FileError = new TStringList(NULL);
  AnsiString urli = "https://www.virustotal.com/en/search/?query=" +Hesh;
  int ret = 0;
  struct curl_httppost *formpost=NULL;
  long http_response_code = 0;
  std::auto_ptr<TStringList> Zapros (new TStringList(NULL) );
 
  HINSTANCE cl = NULL;
  // dlLibcurl массив char[] содержит путь к libcurl.dll
  cl = LoadLibrary( dlLibcurl );
   
   if( cl ==  NULL )
   {
      // загружаем библиотеку
      //MessageBox(NULL, "I can't load libcurl","ERROR", 0);
        //если нельзя загрузить
      FreeLibrary(cl);
      ret = 100;
   }
   else
   {
      // объявление указателей на функции
      CURL*(__stdcall *curl_easy_init)();
      CURLFORMcode (__stdcall *curl_formadd)(struct curl_httppost ** firstitem, struct curl_httppost ** lastitem, ...);
      CURLcode(__stdcall *curl_easy_setopt )(CURL *curl, CURLoption option, ...);
      CURLcode (__stdcall *curl_easy_perform )(CURL *curl);
      CURLcode(__stdcall *curl_easy_getinfo )(CURL *curl, CURLINFO info, ...);
      void (__stdcall *curl_easy_cleanup )(CURL *curl);
      void (__stdcall *curl_formfree)(struct curl_httppost * form);
      //struct curl_slist *(__stdcall *curl_slist_append )(struct curl_slist *list,const char *string);
     // void (__stdcall *curl_slist_free_all)(struct curl_slist * list);
 
      // присваиваем указателям функций  соответствующие адреса функции DLL
      curl_easy_init = (CURL*(__stdcall*)())GetProcAddress(cl, "curl_easy_init" );
      curl_easy_setopt =(CURLcode(__stdcall *)(CURL *curl, CURLoption option, ...))GetProcAddress(cl, "curl_easy_setopt");
      curl_easy_perform =(CURLcode(__stdcall *)(CURL *curl))GetProcAddress(cl, "curl_easy_perform");
      curl_easy_cleanup =(void (__stdcall *)(CURL *curl))GetProcAddress(cl, "curl_easy_cleanup");
      curl_easy_getinfo=(CURLcode(__stdcall *)(CURL *curl, CURLINFO info, ...))GetProcAddress (cl, "curl_easy_getinfo");
      //curl_slist_append=(curl_slist*(__stdcall *)(struct curl_slist *list,const char *string))GetProcAddress(cl,"curl_slist_append");
      curl_formadd = (CURLFORMcode (__stdcall *)(struct curl_httppost ** firstitem, struct curl_httppost ** lastitem, ...))GetProcAddress(cl,"curl_formadd");
      curl_formfree = (void (__stdcall *)(struct curl_httppost * form))GetProcAddress(cl, "curl_formfree");
      //curl_slist_free_all= (void (__stdcall *)(struct curl_slist * list))GetProcAddress(cl, "curl_slist_free_all");
 
      if(!curl_easy_init || !curl_easy_setopt || !curl_easy_perform || !curl_easy_cleanup
          || !curl_formadd || !curl_easy_getinfo)
      {
         FreeLibrary(cl);
         ret = 101;
         //MessageBox(NULL, "setopt_es","ERROR", 0);
      }
      else
      {
         MyScanVT.http_response_code = 0;
 
         curl = curl_easy_init();
 
         if (!curl)
         {
            FileError->Add("init curl");
         }
         else
         {
            curl_easy_setopt(curl, CURLOPT_URL, urli.c_str());
            curl_easy_setopt(curl, CURLOPT_HTTPPOST, formpost);
            curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1);
            curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);
            curl_easy_setopt(curl, CURLOPT_WRITEDATA, &contep);
 
            res = curl_easy_perform(curl);
 
            if(res == CURLE_OK)
            {
               Zapros->Text = UTF8ToString(contep.c_str());
 
               if(Zapros->Text != "")
               {
                  for(int i = 0; i<Zapros->Count ; i++)
                  {
                     if(Zapros->Strings[i].Pos("class=\"row\">") !=0)
                     {
                        curl_easy_cleanup(curl);
 
                        if (formpost)
                           curl_formfree(formpost);  // cleanup the formpost chain
                        FreeLibrary(cl);
                        MessageBox(NULL, "setopt_es","ERROR", 0);
                        return true;
                     }
                  }
               }
            }
         }
      }
 
      curl_easy_cleanup(curl);
 
      if (formpost)
         curl_formfree(formpost);  // cleanup the formpost chain
   }
 
   FreeLibrary(cl);
   MessageBox(NULL, "setopt_no","ERROR", 0);
   return false;
}
Проблема в том если ее переношу в поток (именно в потоке эта ошибка), то при выполнение программы выдает ошибку "Ошибка чтения по такому то адресу". Особенно если в releas. Но если в Debug то отрабатывает все норм.
Ошибка происходит всегда или перед return или "послу ретурн" но из функции не выходит.
Как узнал - всегда выходит сообщение от MessageBox но как нажимаю ок то сразу ошибка чтения по такому то адресу.

Добавлено через 8 часов 50 минут
Не много по экспериментировал и понял, что всему вина FreeLibrary(cl).
Вопрос по чему?

Добавлено через 1 час 7 минут
Вот вся ошибка.

Если загружаю длл динамически и в потоке, то при использование функции FreeLibrary(cl); и выходит эта ошибка. Вопрос как это можно исправить?

Добавлено через 23 часа 15 минут
Господа может кто то подскажет решение?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
04.01.2015, 23:28
Ответы с готовыми решениями:

Ошибка access violation executing location при динамическом подключении dll
Товарищи, помогите понять, что я упустил. Делаю все dроде как в статьях пишут, но возникает ошибка в процессе выполнения программы...

Ошибка выполнения скрипта при подключении JSON
Здравствуйте, уважаемые форумчане! У меня появилась следующая проблема. Я подключаю строчку: dataType: 'json', к jQuery Ajax...

Ошибка. libcurl.dll - программа не предназначена для выполнения в Windows
VS2010, Windows10 64 x64 Установил библиотеку cURL nmake /f Makefile.vc mode=dll VC=10 MACHINE=x86 Все созданные файлы перекинул в...

10
12 / 12 / 4
Регистрация: 07.09.2012
Сообщений: 542
05.01.2015, 11:53
Если речь про MessageBox, то он плохо с потоками работает. Как я понимаю, при выносе в отдельных поток, проблемы с синхронизацией потоков (код весь не читал). То есть 2 потока, а данные общие (форма).
1
Марсианин)))
713 / 46 / 15
Регистрация: 18.07.2010
Сообщений: 637
06.01.2015, 00:11  [ТС]
Цитата Сообщение от klynxe Посмотреть сообщение
Если речь про MessageBox, то он плохо с потоками работает. Как я понимаю, при выносе в отдельных поток, проблемы с синхронизацией потоков (код весь не читал). То есть 2 потока, а данные общие (форма).
Это я делал для проверки. И дело не в MessageBox. А в FreeLibrary(cl);
0
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
12.01.2015, 15:28
Цитата Сообщение от Dr.Xank Посмотреть сообщение
Как узнал - всегда выходит сообщение от MessageBox но как нажимаю ок то сразу ошибка чтения по такому то адресу.
Следовательно FreeLibrary отрабатывает нормально. Ну или по крайней мере выход из нее происходит.

Попробуйте ради хохмы занулять указатель cl. То есть принудительно, после каждого освобождения библиотеки. Везде. Что-то типа такого:
C++
if( cl )
  {
  FreeLibrary(cl);
  cl = NULL;
  }
Но что-то мне чуется, что если вы в одном потоке выгрузите эту библиотеку, то другой ее и не найдет. Следовательно ошибка возникает по выходу из PostHesh, то есть ровно в сто девятой строке.
0
Марсианин)))
713 / 46 / 15
Регистрация: 18.07.2010
Сообщений: 637
12.01.2015, 16:14  [ТС]
Цитата Сообщение от SatanaXIII Посмотреть сообщение
Попробуйте ради хохмы занулять указатель cl. То есть принудительно, после каждого освобождения библиотеки. Везде. Что-то типа такого:
Я даже Везде удалил FreeLibrary(cl);
Ве равно выскакивает AV.

Цитата Сообщение от SatanaXIII Посмотреть сообщение
Но что-то мне чуется, что если вы в одном потоке выгрузите эту библиотеку, то другой ее и не найдет. Следовательно ошибка возникает по выходу из PostHesh, то есть ровно в сто девятой строке.
Да если вызвать эту функцию повиорно то возникает AV, если вызвать один раз то все норм. Даже в пределах одного потока.

C++
1
2
3
4
5
6
void __fastcall ProbaLibPotok::Execute()
{
    PostHesh(patch);//отрабатывается норм.
    Sleep(2000);//норм
    PostHesh(patch);//сразу AV =Access Violation 
}
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
13.01.2015, 18:00
Это гадание на кофейной гуще...
Поставь breakpoint в начале метода PostHesh() и выясни, какая строка бросает исключение.
0
Марсианин)))
713 / 46 / 15
Регистрация: 18.07.2010
Сообщений: 637
13.01.2015, 18:26  [ТС]
Цитата Сообщение от BRcr Посмотреть сообщение
Это гадание на кофейной гуще...
Поставь breakpoint в начале метода PostHesh() и выясни, какая строка бросает исключение.
В Этом и проблема, что в Debug работает все нормально и вылета нет. А вот как перекомпилирую в Releass то вот здесь и вылетает.
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
13.01.2015, 20:52
Так, стоп. Кое-что было упущено - если PostHesh является методом формы, его нельзя вызывать напрямую в потоке. Более того, внутри этого метода есть обращения к чему-то, называющемуся MyScanVT. Все это потенциально небезопасно в потоке.
0
Марсианин)))
713 / 46 / 15
Регистрация: 18.07.2010
Сообщений: 637
13.01.2015, 21:31  [ТС]
Цитата Сообщение от BRcr Посмотреть сообщение
если PostHesh является методом формы
Нет не является. Эта функция описана в потоке и является его методом.
Цитата Сообщение от BRcr Посмотреть сообщение
называющемуся MyScanVT.
Это структуру которая описана\реализована в потоке
bool __fastcall TForm3::PostHesh(AnsiString Hesh)
Это я прописывал в новом проекте, пробовал может, что то в ней.
0
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
14.01.2015, 08:43
Цитата Сообщение от Dr.Xank Посмотреть сообщение
Это я прописывал в новом проекте, пробовал может, что то в ней.
Это ввело нас всех в заблуждение. В следующий раз старайтесь показывать именно тот код, который вызывает ошибку.
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
14.01.2015, 12:26

Не по теме:

Аццкий сайт у либкурлов... хэдеры чтоб скачать, весь мозг выкрутить надо.:ireful:



Dr.Xank, показывай уже весь код. Кому это надо - гадать, что у тебя и где написано? И callback write_data не забудь.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
14.01.2015, 12:26
Помогаю со студенческими работами здесь

Ошибка при отправке письма через libcurl
Пытаюсь отправить письмо самому себе через почтовый клиент, написанный с помощью libcurl на C. Пробовал и через SMTP, и через IMAP, но...

Ошибка при динамическом выделении памяти
Я не понимаю почему, но почему-то пример по динамическому выделению памяти, взятый с этой веб-страницы: http://cppstudio.com/post/9555/...

Ошибка при динамическом выделении памяти
Здравствуйте! В программе возникает ошибка при выполнении: отлаживаю:после 9 строчки переходит сразу на 18. Размер файла определяется...

Ошибка при динамическом выделении памяти
почему у меня возникет ошибка вот тут struct TOVAR *New = new struct TOVAR; пишит недопустимый неполный тип на struct подчеркивает...

Ошибка при динамическом создании данных
Приветству.Ррешил я поставить альфа скин в программе, заменил pagecontrol на TsPageControl, listview на slistview, сменил их name на старые...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
Установка Emscripten SDK (emsdk) и CMake на Windows для сборки C и C++ приложений в WebAssembly (Wasm)
8Observer8 30.01.2026
Чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. Система контроля версиями Git. . .
Подключение Box2D v3 к SDL3 для Android: физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru