При использовании динамического связывания (dll) как мне обрабатывать значения #define внутри dll?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 При использовании динамического связывания (dll) как мне обрабатывать значения #define внутри dll?

Сообщение Anonymous »

Я учусь работать с DLL в Windows с помощью C++, в частности с функциями LoadLibrary и GetProcAddress. Для практики я выбрал 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++, и я пытаюсь глубже понять эти концепции. Буду признателен за любые советы и идеи!
РЕДАКТИРОВАТЬ
Для пояснения:
Я добавил вручную #defines в моем проекте, чтобы я мог протестировать LOADLIBRARY и GETPROCADDRESS. это сработало, и я смог отправлять HTTP-запросы.
Затем я попытался добавить Curl.h (чтобы мне не приходилось вручную объявлять #defines, необходимые для выполнения операций скручивания ), но я получил кучу предупреждений (потому что компилятор заглядывает внутрь "curl.h" и видит множество определений [это заголовок библиотеки], но, конечно, я их не реализовал... Я импортирую функции из DLL, используя GETPROCADDRESS);
Пример предупреждений (постов всего 4, а всего их 35, все равно "определение функции xxxxx не найдено"):
*1. Определение функции для «curl_strequal» не найдено.
  • Определение функции для «curl_strnequal» не найдено.
    < li>Определение функции для «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. Но для выполнения операций мне нужны значения CURLOPT_* (те, которые изначально я определил вручную для проверки кода). Итак, после добавления Curl.h (этот заголовок загружается вместе, если libcurl.dll [в папке включения]) я получил предупреждения.
Я думаю, что главный вопрос:
При динамической загрузке .dll и использовании ее функций, как обращаться со значениями, которые были ОПРЕДЕЛЕНЫ (с помощью #define) внутри библиотеки? Мне следует статически связать заголовочный файл, хотя я пытаюсь загрузить его только динамически? Если да, то как бороться с предупреждениями (поскольку .h содержит гораздо больше функций, которые необходимо определить, но они все мне не нужны в моем проекте)?

Подробнее здесь: https://stackoverflow.com/questions/793 ... -define-in
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»