При использовании динамического связывания (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++ и пытаюсь глубже понять эти концепции.

РЕДАКТИРОВАТЬ

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. Но для выполнения операций мне нужны значения CURLOPT_... (те, которые изначально я определил вручную для проверки кода). Итак, после добавления curl.h я получаю предупреждения.
Я думаю, главный вопрос:
При динамической загрузке .dll и используя его функции, как обращаться со значениями, которые были ОПРЕДЕЛЕНЫ (с помощью #define) внутри библиотеки? Должен ли я статически[/b] связать заголовочный файл, даже если я пытаюсь загрузить его только динамически? Если да, то как бороться с предупреждениями? Файл .h содержит гораздо больше функций, чем необходимо определить, но мне не нужны все они в моем проекте.

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

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

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

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

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

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