kulinich
@kulinich
С++ программист

Подключение dll к проекту Visual Studio 2010 (C++)

Есть библиотека (*.dll), в которой реализованы функции. Файла lib к этой библиотеки нет, но есть заголовочный файл (*.h) с объявлениями функций. Необходимо получить доступ к этим функциям.

Пробовал сделать lib-файл с помощью программы: Implib.exe, но пишет ошибку (IM2603 — invalid .DLL file).

Каким способом можно обращаться к функциям этой библиотеки?
  • Вопрос задан
  • 20083 просмотра
Пригласить эксперта
Ответы на вопрос 5
kostik450
@kostik450
Делаете так:
lib.exe /DEF:test.def /OUT:test.lib /MACHINE:IX86

В файле test.def нужно записать:
LIBRARY TEST
EXPORTS
testfunc@32 @1

Узнать, какие там цифры вместо @32 проще всего через ошибки линковки (число в имени функции обычно равно числу ее параметров, умноженному на 4), а что там вместо @1 можно узнать через утилиту dumpbin.exe по списку экспортируемых из DLL функций.

Бывают DLL и без @32 — это зависит от того, как она была скомпилирована через __cdecl или через __stdcall
(это тоже легко устанавливается экспериментально)
Ответ написан
Комментировать
@MikhailEdoshin
Нужно сделать .lib-файл самостоятельно. Посмотрите, нет ли в комплекте с .dll файла .def. Если есть, то можно получить .lib с помощью

lib.exe /DEF:mylib.def mylib.dll

или

lib.exe /DEF:mylib.def /OUT:mylibname.lib mylib.dll

если нужно другое имя. В таком виде (dll + def), распространяется, например, sqlite3.

Если .def-файла нет, посмотрите, какие у вас символы в библиотеке через

dumpbin /exports mylib.dll

Если это практически те же имена, что и в заголовочном файле, значит, библиотека экспортирует символы в стиле С; это хорошо. Перечислите все нужные имена в командной строке:

lib.exe /EXPORT:mylib_func1 /EXPORT:mylib_func2 mylib.dll

(.def-файл, по сути, делает то же самое.) Единственное, я сейчас не помню, но к именам может спереди добавлятся подчеркивание. Я не уверен, нужно ли указывать имена с подчеркиванием или без.

Если там имен нет, значит, они отрезаны, функции можно определить только по порядковому номеру. Если вокруг них всякая муть, это C++, а муть означает закодированный тип параметров. Это все не очень хорошо, конечно, потому что соответствие номеров функциям не определить (разве что экспериментально), а стандарта на кодирование нет. Но технически создать .lib-файл можно, у опции /EXPORT полная сигнатура такая:

/EXPORT: entryname[= internalname][,@ ordinal[, NONAME]][, DATA]

То есть можно и переименовать функцию, и по номеру ее выбрать, и данные экспортировать. Но это на крайний случай.

lib.exe обычно не в PATH, из обычной командной строки не найдется, но в группе инструментов Visual Studio должно быть что-то вроде «Command Prompt» — он открывает консоль и добавляет нужные пути в PATH, так что инструменты командной строки становятся доступными.

Ссылки: dumpbin, lib.
Ответ написан
zed91
@zed91
Объявляете указатель на функцию (такую как в h-нике), и переменную такого типа. Подгружаете библиотеку (LoadLibrary) Потом получаете адрес функции из библиотеки в помощью функции «GetProcAddress», и присваиваете этот адрес переменной типа указателя на функцию. Теперь функцию можно вызывать. Механизм называется динамическая подгрузка библиотеки. Примерно так:

typedef int (__stdcall somefuncptr*) (int, int); //по поводу этой строки не уверен

somefuncptr somefunc;

somefunc = GetProcAddress(«dllfuncname»);

int someval = somefunc(5, 10);
Ответ написан
Комментировать
kulinich
@kulinich Автор вопроса
С++ программист
Спасибо, кто уже ответил! Сейчас буду экспериментировать. По итогам отпишусь.
Ответ написан
Комментировать
xanep
@xanep
А вы динамически подгружать библиотеку не хотите? Как zed91 написал.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы