Для практики я выбрал libcurl в качестве примера для экспериментов с динамическим связыванием. Мне удалось использовать libcurl в качестве DLL, но мне пришлось определить несколько констант в моем собственном файле .cpp, например:
Код: Выделить всё
#define CURLOPT_URL 10002
#define CURLOPT_POST 47
#define CURLOPT_POSTFIELDS 10015
#define CURLOPT_WRITEFUNCTION 20011
#define CURLOPT_WRITEDATA 10001
#define CURLE_OK 0
Код: Выделить всё
curlFunctions->easy_setopt(curl, CURLOPT_URL, request.url.c_str());
curlFunctions->easy_setopt(curl, CURLOPT_WRITEFUNCTION, writeCallback);
curlFunctions->easy_setopt(curl, CURLOPT_WRITEDATA, response);
Поскольку я динамически подключаюсь к libcurl.dll, а не статически ссылаясь на libcurl.lib, нужно ли мне еще включать Curl.h в мой проект? Или я могу просто использовать LoadLibrary и GetProcAddress для загрузки и вызова функций из DLL без необходимости включения заголовка?
Прошу прощения, если это не так. основной вопрос: я все еще изучаю WinAPI и C++ и пытаюсь глубже понять эти концепции.
РЕДАКТИРОВАТЬ
EDIT
Для пояснение:
Я вручную добавил #define в мой проект, чтобы можно было протестировать LoadLibrary и GetProcAddress функции. Это сработало, и я смог отправлять HTTP-запросы.
Затем я попытался добавить curl.h (чтобы мне не приходилось вручную объявлять #defines необходимо для выполнения операций скручивания), но я получаю кучу предупреждений, потому что компилятор просматривает Curl.h и видит множество определений, но я, конечно, не реализовал их. Импортирую функции из DLL с помощью GetProcAddress.
Пример предупреждений (выкладываю всего 4, а всего их 35, все равно "определение функции xxxxx не найдено" ):
- Определение функции для «curl_strequal» не найдено.
- Определение функции для 'curl_strnequal' не найден.
- Определение функции для 'curl_mime_init' не найдено.
- Определение функции для 'curl_mime_free' не найдено.*
(... )
Пример того, какой я импорт из libcurl.dll (я немного подчистил его, чтобы показать использование «основных» функций):
Код: Выделить всё
hModuleLibCurl = LoadLibrary(TEXT("libcurl-x64.dll"));
if (!hModuleLibCurl) {
return;
}
// Load function pointers
easy_init = (CurlEasyInit)GetProcAddress(hModuleLibCurl, "curl_easy_init");
easy_cleanup = (CurlEasyCleanup)GetProcAddress(hModuleLibCurl, "curl_easy_cleanup");
easy_setopt = (CurlEasySetopt)GetProcAddress(hModuleLibCurl, "curl_easy_setopt");
easy_perform = (CurlEasyPerform)GetProcAddress(hModuleLibCurl, "curl_easy_perform");
easy_getinfo = (CurlEasyGetinfo)GetProcAddress(hModuleLibCurl, "curl_easy_getinfo");
slist_append = (CurlSlistAppend)GetProcAddress(hModuleLibCurl, "curl_slist_append");
// Check if any of the function pointers failed to load
if (!easy_init || !easy_cleanup || !easy_setopt || !easy_perform || !easy_getinfo || !slist_append) {
FreeLibrary(hModuleLibCurl);
}
Я думаю, главный вопрос:
При динамической загрузке .dll и используя его функции, как обращаться со значениями, которые были ОПРЕДЕЛЕНЫ (с помощью #define) внутри библиотеки? Должен ли я статически[/b] связать заголовочный файл, даже если я пытаюсь загрузить его только динамически? Если да, то как бороться с предупреждениями? Файл .h содержит гораздо больше функций, чем необходимо определить, но мне не нужны все они в моем проекте.
Подробнее здесь: https://stackoverflow.com/questions/793 ... -define-in
Мобильная версия