Как подключить curl в билдер 6

Discussion in 'Болталка' started by rudi, 17 Jul 2010.

  1. rudi

    rudi Active Member

    Joined:
    3 Jun 2010
    Messages:
    487
    Likes Received:
    184
    Reputations:
    5
    привет.
    Хочу юзать curl в билдере 6
    у меня windows xp
    скачл curl отсюда
    http://curl.haxx.se/download.html#Win32
    7.21.0 libcurl

    Подключаю curl к билдеру так
    Теперь, когда мы скачали архив с проектом libcurl, распакуем его и обратим внимание на вложенные папки. Папка Bin таит в себе все необходимые для работы файлы *.dll (прилагающийся curl.exe не нужен). Скопируем их из этой папки в папку Bin каталога Builder C++. Затем в корневом каталоге скачанной libcurl найдем под-подкаталог curl по адресу \Include\curl – это каталог заголовков, которые включают в проект по мере необходимости при компиляции программы. Копируем этот каталог в каталог Include директории Builer C++. Все.


    потом пишу код
    PHP:
    #include <stdio.h>
    #include <curl/curl.h>
     
    int main(void)
    {
      
    CURL *curl;
      
    CURLcode res;
     
      
    curl curl_easy_init();
      if(
    curl) {
        
    curl_easy_setopt(curlCURLOPT_URL"curl.haxx.se");
        
    res curl_easy_perform(curl);
     
        
    /* always cleanup */ 
        
    curl_easy_cleanup(curl);
      }
      return 
    0;
    }
    и вижу ошибки:

    [C++ Warning] wspiapi.h(786): W8060 Possibly incorrect assignment
    [C++ Warning] Unit1.cpp(24): W8004 'res' is assigned a value that is never used
    [Linker Error] Unresolved external '_curl_easy_init' referenced from C:\PROGRAM FILES\BORLAND\CBUILDER6\PROJECTS\TESTCURL\UNIT1.OBJ
    [Linker Error] Unresolved external '_curl_easy_setopt' referenced from C:\PROGRAM FILES\BORLAND\CBUILDER6\PROJECTS\TESTCURL\UNIT1.OBJ
    [Linker Error] Unresolved external '_curl_easy_perform' referenced from C:\PROGRAM FILES\BORLAND\CBUILDER6\PROJECTS\TESTCURL\UNIT1.OBJ
    [Linker Error] Unresolved external '_curl_easy_cleanup' referenced from C:\PROGRAM FILES\BORLAND\CBUILDER6\PROJECTS\TESTCURL\UNIT1.OBJ
     
  2. rudi

    rudi Active Member

    Joined:
    3 Jun 2010
    Messages:
    487
    Likes Received:
    184
    Reputations:
    5
    там вроде еще нужно генерить LIB файлы
    но я так и не смог разобраться с этим
     
  3. M_script

    M_script Members of Antichat

    Joined:
    4 Nov 2004
    Messages:
    2,582
    Likes Received:
    1,310
    Reputations:
    1,557
    Не знаю ни одного человека, который в билдере смог либкурл подключить статически.
    Подключай динамически (LoadLibrary и GetProcAddress).

    Только почему болталка, а не кодинг?
     
  4. rudi

    rudi Active Member

    Joined:
    3 Jun 2010
    Messages:
    487
    Likes Received:
    184
    Reputations:
    5
    изменил код так
    PHP:
    //---------------------------------------------------------------------------

    #include <vcl.h>
    #pragma hdrstop

    #include <stdio.h>
    #include <curl/curl.h>

    #pragma argsused
    int main(int argccharargv[])
    {
      
    CURL *curl;
      
    CURLcode res;
      
    HINSTANCE cl NULL;
       if( ( 
    cl LoadLibrary"libcurl.dll" ) ) ==  NULL )
         {
            
    //  загружаем библиотеку
            
    MessageBox(NULL"I can't load libcurl","ERROR"0);
            
    //если нельзя загрузить 
            
    FreeLibrary(cl);
         }   

      
    curl curl_easy_init();
      if(
    curl) {
        
    curl_easy_setopt(curlCURLOPT_URL"curl.haxx.se");
        
    res curl_easy_perform(curl);
     
        
    /* always cleanup */ 
        
    curl_easy_cleanup(curl);
      }
      return 
    0;
    }
    //---------------------------------------------------------------------------

    но ошибки остались
    ошибка то происходит на линовке
    а функция LoadLibrary сработает как уже запуститься приложение
     
  5. rudi

    rudi Active Member

    Joined:
    3 Jun 2010
    Messages:
    487
    Likes Received:
    184
    Reputations:
    5
    кстате саму LIB же нужно сгенерировать для борланда как я понял?
    Ибо я скачал с официального сайта
    там в архиве только Header файлы и dll
    а самого LIB нету
    в папке LIB файлы с раширением *.a
     
  6. M_script

    M_script Members of Antichat

    Joined:
    4 Nov 2004
    Messages:
    2,582
    Likes Received:
    1,310
    Reputations:
    1,557
    Повторю еще раз:
     
  7. M_script

    M_script Members of Antichat

    Joined:
    4 Nov 2004
    Messages:
    2,582
    Likes Received:
    1,310
    Reputations:
    1,557
    Пример использования GetProcAddress:

    Вариант 1
    PHP:
    CURLcode(__stdcall *curl_easy_setopt )(CURL *curlCURLoption option, ...);
    curl_easy_setopt =(CURLcode(__stdcall *)(CURL *curlCURLoption option, ...))GetProcAddress(libcurl"curl_easy_setopt");
    Вариант 2
    PHP:
    c_easy_setopt curl_easy_setopt = (c_easy_setopt)GetProcAddress(libcurl"curl_easy_setopt");
    тип "c_easy_setopt":
    PHP:
    typedef CURLcode (__stdcallc_easy_setopt)(CURLcurlCURLoption option, ...);
     
  8. rudi

    rudi Active Member

    Joined:
    3 Jun 2010
    Messages:
    487
    Likes Received:
    184
    Reputations:
    5
    спасибо
    измнил свой код так
    и стало работать
    PHP:
    //---------------------------------------------------------------------------

    #include <vcl.h>
    #pragma hdrstop

    #include <stdio.h>
    #include <curl/curl.h>

    #pragma argsused


    int main(int argccharargv[])
    {

      
    CURL *curl;
      
    CURLcode res;
      
    HINSTANCE cl NULL;
       if( ( 
    cl LoadLibrary"libcurl.dll" ) ) ==  NULL )
         {
            
    // загружаем библиотеку
            
    MessageBox(NULL"I can't load libcurl","ERROR"0);
            
    //если нельзя загрузить
            
    FreeLibrary(cl);
         }   
     
    // объявление указателей на функции
      
    CURL*(__stdcall *curl_easy_init)();
      
    CURLcode(__stdcall *curl_easy_setopt )
      (
    CURL *curlCURLoption option, ...);
      
    CURLcode (__stdcall *curl_easy_perform )
      (
    CURL *curl);
      
    CURLcode(__stdcall *curl_easy_getinfo )
      (
    CURL *curlCURLINFO info, ...);
      
    void (__stdcall *curl_easy_cleanup )
      (
    CURL *curl);
      
    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 *curlCURLoption 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 *curlCURLINFO 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_slist_free_all=(void(__stdcall *) (struct curl_slist *list))
      
    GetProcAddress (cl,"curl_slist_free_all");
      
    curl curl_easy_init();



      if(
    curl) {
        
    curl_easy_setopt(curlCURLOPT_URL"curl.haxx.se");
        
    res curl_easy_perform(curl);
     
        
    /* always cleanup */ 
        
    curl_easy_cleanup(curl);
      }
      
    system("PAUSE");
      return 
    0;
    }
    //---------------------------------------------------------------------------


    получается что библиотека *.Lib создается динамически
    верно?
     
  9. M_script

    M_script Members of Antichat

    Joined:
    4 Nov 2004
    Messages:
    2,582
    Likes Received:
    1,310
    Reputations:
    1,557
    Есть два типа подключения - явное и неявное. В данном случае lib-файлы не нужны.
     
  10. rudi

    rudi Active Member

    Joined:
    3 Jun 2010
    Messages:
    487
    Likes Received:
    184
    Reputations:
    5
    спасибо
    поставил бы тебе плюсик
    не вижу как.....

    я пишу чтото вроде класса
    по управлению функциями curl
    чтобы было удобнее ими управлять....

    хочу реальзовать с поддержкой включения и выключенимя таких опций как:
    https
    Прокси
    Неблокируемые сокеты (для работы с прокси думаю они полезны)

    и в конце попробывать реализовать какой нить проект
    что использует curl многопоточно

    Вопрос
    Нужно ли в curl чтото включать особенное
    для реализации его в многопоточной программе?
    спасибо.
     
  11. mailbrush

    mailbrush Well-Known Member

    Joined:
    24 Jun 2008
    Messages:
    1,997
    Likes Received:
    996
    Reputations:
    155
    Вот тебе параметр, я его долго искал, но все-таки нашёл - для работы с HTTPS.
    PHP:
    curl_easy_setopt(curlCURLOPT_SSL_VERIFYPEER0);
    Просто копируешь эту строчку в свой код, и дальше в CURLOPT_URL можешь указывать https://site.ru

    Без этой опции курл будет возвращать пустую строку.
     
  12. rudi

    rudi Active Member

    Joined:
    3 Jun 2010
    Messages:
    487
    Likes Received:
    184
    Reputations:
    5
    спасибо
    попробую тоже
    я еще вот 1 нашол, тоже относятся к HTTPS
    итого получаем
    PHP:
    #ifdef SKIP_PEER_VERIFICATION
                
    curl_easy_setopt(curlCURLOPT_SSL_VERIFYPEER0L);
                
    #endif
                #ifdef SKIP_HOSTNAME_VERFICATION
                
    curl_easy_setopt(curlCURLOPT_SSL_VERIFYHOST0L);
                
    #endif
     
  13. M_script

    M_script Members of Antichat

    Joined:
    4 Nov 2004
    Messages:
    2,582
    Likes Received:
    1,310
    Reputations:
    1,557
    https - привели пример
    прокси - CURLOPT_PROXY, CURLOPT_PROXYTYPE
    неблокируемые сокеты - нет
    для многопоточности ничего дополнительно включать не нужно

    кроме libcurl попробуй еще использовать curlpp
     
  14. rudi

    rudi Active Member

    Joined:
    3 Jun 2010
    Messages:
    487
    Likes Received:
    184
    Reputations:
    5
    а какже мульти курл?
    или можно обойтись и без него?
    я тока тока начал изучать curl
    и не совсем понятно что я выиграю используя
    curl_multi_init();
    curl_multi_add_handle ();

    Можно же получается реальзовать многопочностm и иными средствами используя при этом curl

    Укого нить есть мини-код примера многопоточности*?