привет. Хочу юзать 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(curl, CURLOPT_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
Не знаю ни одного человека, который в билдере смог либкурл подключить статически. Подключай динамически (LoadLibrary и GetProcAddress). Только почему болталка, а не кодинг?
изменил код так PHP: //--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include <stdio.h> #include <curl/curl.h> #pragma argsused int main(int argc, char* argv[]) { 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(curl, CURLOPT_URL, "curl.haxx.se"); res = curl_easy_perform(curl); /* always cleanup */ curl_easy_cleanup(curl); } return 0; } //--------------------------------------------------------------------------- но ошибки остались ошибка то происходит на линовке а функция LoadLibrary сработает как уже запуститься приложение
кстате саму LIB же нужно сгенерировать для борланда как я понял? Ибо я скачал с официального сайта там в архиве только Header файлы и dll а самого LIB нету в папке LIB файлы с раширением *.a
Пример использования GetProcAddress: Вариант 1 PHP: CURLcode(__stdcall *curl_easy_setopt )(CURL *curl, CURLoption option, ...); curl_easy_setopt =(CURLcode(__stdcall *)(CURL *curl, CURLoption 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 (__stdcall* c_easy_setopt)(CURL* curl, CURLoption option, ...);
спасибо измнил свой код так и стало работать PHP: //--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include <stdio.h> #include <curl/curl.h> #pragma argsused int main(int argc, char* argv[]) { 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 *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); 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_slist_free_all=(void(__stdcall *) (struct curl_slist *list)) GetProcAddress (cl,"curl_slist_free_all"); curl = curl_easy_init(); if(curl) { curl_easy_setopt(curl, CURLOPT_URL, "curl.haxx.se"); res = curl_easy_perform(curl); /* always cleanup */ curl_easy_cleanup(curl); } system("PAUSE"); return 0; } //--------------------------------------------------------------------------- получается что библиотека *.Lib создается динамически верно?
спасибо поставил бы тебе плюсик не вижу как..... я пишу чтото вроде класса по управлению функциями curl чтобы было удобнее ими управлять.... хочу реальзовать с поддержкой включения и выключенимя таких опций как: https Прокси Неблокируемые сокеты (для работы с прокси думаю они полезны) и в конце попробывать реализовать какой нить проект что использует curl многопоточно Вопрос Нужно ли в curl чтото включать особенное для реализации его в многопоточной программе? спасибо.
Вот тебе параметр, я его долго искал, но все-таки нашёл - для работы с HTTPS. PHP: curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0); Просто копируешь эту строчку в свой код, и дальше в CURLOPT_URL можешь указывать https://site.ru Без этой опции курл будет возвращать пустую строку.
спасибо попробую тоже я еще вот 1 нашол, тоже относятся к HTTPS итого получаем PHP: #ifdef SKIP_PEER_VERIFICATION curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L); #endif #ifdef SKIP_HOSTNAME_VERFICATION curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L); #endif
https - привели пример прокси - CURLOPT_PROXY, CURLOPT_PROXYTYPE неблокируемые сокеты - нет для многопоточности ничего дополнительно включать не нужно кроме libcurl попробуй еще использовать curlpp
а какже мульти курл? или можно обойтись и без него? я тока тока начал изучать curl и не совсем понятно что я выиграю используя curl_multi_init(); curl_multi_add_handle (); Можно же получается реальзовать многопочностm и иными средствами используя при этом curl Укого нить есть мини-код примера многопоточности*?