У меня такая ситуация, я хочу написать программу, которая использует dll библиотеку, взял отсюда _http://slesh.name/?act=releases
Компилирую в VS, при компиляции не находи функции библиотеки, да и вообще походу ее не регистрирует.
Долго мучился и решил написать сюда. (почитал статьи из инета, ничего подходящего не нашел)
Подскажите где ТОЛКОВО написано об этом, можно пример, желательно на VS.
ps раньше у меня получалось работать с dll, но вот конкретно с этой библиотекой ничего поделать не могу...
Пробовал lib файл подключать, как бы файл находит, но библиотеку не регистрирует, DllMain не выполняется.
Короче ужас какой то =)
Помогите, может у кого есть ссылка на нормальную статью по моей теме (желательно из книги), был бы рад примеру (особенно если бы пример касался IcqMod.DLL).
Здравствуйте, MasterZiv, Вы писали:
MZ>А где её по твоему мнению надо регистрировать ?
Ну, по видимому в системе.
MZ>О чём ?
Ну как о чем? Название темы говорит само за себя.
>> Пробовал lib файл подключать, как бы файл находит, но библиотеку не >> регистрирует, DllMain не выполняется.
MZ>Где ты её хочешь регистрировать, ещё раз ?
В системе, на счет либ файлов не знаю регистрирует ли их как dll.
Попытаюсь перефразировать вопрос.
Как из библиотеки вычитать все функции ее? и возможно ли потом использовать их, не зная устройства (функций).
И если я знаю их устройство, объявил их
.... ULONG _stdcall ICQSendMsg(PICQ_CLIENT client, char * UIN, char * msg); ....
Но при исполнении кода он не находит вызываемую функцию, в чем проблема? Может ли она быть в описании функции? или это почти гарантированно говорит о том, что функция найдена в библиотеке, или сама библиотека не загружена, можно что-то однозначно сказать по этому поводу?
Здравствуйте, stribog, Вы писали:
S>У меня такая ситуация, я хочу написать программу, которая использует dll библиотеку, взял отсюда _http://slesh.name/?act=releases S>Компилирую в VS, при компиляции не находи функции библиотеки, да и вообще походу ее не регистрирует.
Регистрировать её не надо. Надо сделать правильный .lib-файл к данной .dll. Почему автор библиотеки поленился опубликовать его — загадка.
Теоретически, это делается так
Смотришь dumpbin icqmod.dll /exports , что экспортирует DLL.
Исходя из этого, пишешь .def-файл
Напускаешь на него библиотекаря: lib /def:icqmod.def /out:icqmod.lib
Допиливаешь .h-файл, добавив extern "C" к объявлениям функций (иначе они в С++ получат декорированные имена — и линкер их точно не найдёт).
Но у меня этот фокус не вышел. Почему-то компилятор упорно ищет _ICQClose@4 и т.п. вместо ICQClose.
Поэтому — есть второй вариант. Загрузка вручную.
HMODULE dllIcqMod = LoadLibrary("IcqMod.dll");
typedef ULONG (_stdcall *FN_ICQAuth)(PICQ_CLIENT, char *, ULONG);
FN_ICQAuth fnICQAuth = (FN_ICQAuth) GetProcAddress(dllIcqMod, "ICQAuth");
// и то же самое для всех остальных функций
Это — точно сработает. Только нужно ловить ошибки (DLL не загрузилась, функция не нашлась и т.п.)
Ещё одно решение — написать поддельную DLL на Си, экспортирующую точно такие же функции точно в таком же виде (extern "C" __stdcall).
Скомпилировать.
Убедиться, что у неё такая же таблица экспорта, как у исходной. (Вот это вызывает больше всего сомнений )
И затем взять её сопутствующий .lib-файл.
S>ps раньше у меня получалось работать с dll, но вот конкретно с этой библиотекой ничего поделать не могу... S>Пробовал lib файл подключать, как бы файл находит, но библиотеку не регистрирует, DllMain не выполняется.
А что там регистрировать, зачем DllMain вызывать? Это же не COM-сервер.
К>Регистрировать её не надо. Надо сделать правильный .lib-файл к данной .dll. Почему автор библиотеки поленился опубликовать его — загадка.
У борланда, говорят, для этого есть утилита implib (implib32)
В интернете также встречаются шароварные утилиты, рожающие .lib и (если это возможно, .h) из .dll
Попробуй, вдруг повезёт.
Здравствуйте, Кодт, Вы писали:
К>Регистрировать её не надо. Надо сделать правильный .lib-файл к данной .dll. Почему автор библиотеки поленился опубликовать его — загадка.
На том же сайте есть исходники библиотеки, и скомпилировав их получается .lib файл. Но функции все равно не видит....
Еще хотел уточнить, при неявном подключении библиотеки через .lib -файл в ОС dll-ка не регистрируется,а при явном подключении через LoadLibrary("IcqMod.dll"); он ее обязательно регистрирует, и запускает при этом DllMain ? так?
Здравствуйте, stribog, Вы писали:
S>На том же сайте есть исходники библиотеки, и скомпилировав их получается .lib файл. Но функции все равно не видит....
Я бы поступил проще. Выкинул оттуда DllMain, и добавил исходник .cpp в твой проект.
Всё, что потребуется от тебя — вызвать в main() / WinMain() инициализацию винсока — как это было сделано в DllMain.
(Кстати, это ещё вопрос — можно ли из DllMain инициализировать винсок).
Ради 6 килобайт морочиться с DLL смысла нет.
S>Еще хотел уточнить, при неявном подключении библиотеки через .lib -файл в ОС dll-ка не регистрируется,а при явном подключении через LoadLibrary("IcqMod.dll"); он ее обязательно регистрирует, и запускает при этом DllMain ? так?
Нужно убрать фантазии и домыслы про "регистрируется". Ты какой-то особый смысл в это вкладываешь, а у меня телепатия буксует.
Обычно "регистрируется" означает "прописывает в реестр информацию о COM-сервере", чтобы потом можно было создавать COM-объекты, не обращаясь к DLL напрямую (система сама её найдёт, загрузит и вызовет нужные функции у фабрики классов).
В любом случае, при загрузке DLL в процесс, будь то ранняя, отложенная или явная (с помощью LoadLibrary), вызывается DllMain.
Здравствуйте, Кодт, Вы писали:
К>Я бы поступил проще. Выкинул оттуда DllMain, и добавил исходник .cpp в твой проект. К>Всё, что потребуется от тебя — вызвать в main() / WinMain() инициализацию винсока — как это было сделано в DllMain. К>(Кстати, это ещё вопрос — можно ли из DllMain инициализировать винсок).
К>Ради 6 килобайт морочиться с DLL смысла нет.
Это идея у меня была, я её оставил на самый крайний вариант, но сейчас уже все нормально. Спасибо тебе еще раз!
stribog пишет: > MZ>А где её по твоему мнению надо регистрировать ? > > Ну, по видимому в системе.
Ненужно ничего регистрировать в системе.
> В системе, на счет либ файлов не знаю регистрирует ли их как dll.
*.lib тоже нигде в системе регистрировать ненадо.
> Как из библиотеки вычитать все функции ее?
Из .dll в общем случае никак. Из .lib -- просто указать её
линкеру, он сам всё возмёт.
и возможно ли потом > использовать их, не зная устройства (функций).
Невозможно.
> Но при исполнении кода он не находит вызываемую функцию, в чем проблема?
Кто где что не находит ?
> Может ли она быть в описании функции?
Может.
или это почти гарантированно > говорит о том, что функция найдена в библиотеке, или сама библиотека не > загружена, можно что-то однозначно сказать по этому поводу?
Пока можно гарантированно скзать, что ты как-то с С работать не очень умеешь.
Это азы. И это от того, dll это или нет, не зависит.
И совсем не понятно, при чём тут такие проблемы, если на сайте всё для
девелопинга с этой либой лежит (вроде бы как).
Здравствуйте, stribog, Вы писали:
S>Кодт, Спасибо тебе!! Все получилось!
S>Но, все-таки, может кто-нибудь скажет где можно почитать про работу с Dll библиотеками (очень подробно).
Джеффри РИХТЕР
Создание эффективных WIN32-приложений с учетом специфики 64-разрядной версии Windows
ЧАСТЬ IV ДИНАМИЧЕСКИ ПОДКЛЮЧАЕМЫЕ БИБЛИОТЕКИ
ГЛАВА 19 DLL основы
Здравствуйте, stribog, Вы писали:
S>Здравствуйте, MasterZiv, Вы писали:
MZ>>А где её по твоему мнению надо регистрировать ?
S>Ну, по видимому в системе.
Не надо. Регистрировать надо COM-объекты, иногда они реализованы как библиотеки. Простые библиотеки — не надо, они ищутся в PATH b d ntreotv rfnfkjut (в *nix тепкущий каталог не входит в пути поиска)
>>> Пробовал lib файл подключать, как бы файл находит, но библиотеку не >>> регистрирует, DllMain не выполняется.
может не получается слинковаться?
S>Как из библиотеки вычитать все функции ее? и возможно ли потом использовать их, не зная устройства (функций).
Просмотр заголовка PE-файла, секция экспорта, даст имена (если заданы) и ординалы экспортируемых функций. Если не известно устройство — то использовать никак не получится.
S>И если я знаю их устройство, объявил их S>.... extern "C" ULONG _stdcall ICQSendMsg(PICQ_CLIENT client, char * UIN, char * msg); ....
Или, для нескольких:
S>Но при исполнении кода он не находит вызываемую функцию, в чем проблема? Может ли она быть в описании функции? или это почти гарантированно говорит о том, что функция найдена в библиотеке, или сама библиотека не загружена, можно что-то однозначно сказать по этому поводу?
stribog пишет:
> MZ>Чё у тебя там получилось я не понимаю. > MZ>Вообще там на сайте исходники лежат. > > Да я в курсе насчет исходников (про это кстати говорилось выше). А > получилось все что хотел =)
Так нафига сомнительным образом получать библиотеку импорта из .dll,
если можно взять исходники и собрать и .dll, и библиотеку импорта?
И чего ты людям голову морочил -- не понятно.
Здравствуйте, MasterZiv, Вы писали:
MZ>stribog пишет:
MZ>Так нафига сомнительным образом получать библиотеку импорта из .dll, MZ>если можно взять исходники и собрать и .dll, и библиотеку импорта? MZ>И чего ты людям голову морочил -- не понятно.
Дак в том то и дело, когда я сам собираю библиотеку и включаю ее .lib файл, то он не находит функций...
Здравствуйте, MasterZiv, Вы писали:
MZ>stribog пишет:
>> Дак в том то и дело, когда я сам собираю библиотеку и включаю ее .lib >> файл, то он не находит функций...
MZ>Да быть такого не может. Ты что-то значит неправильно делаешь.
MZ>Так, и что ж ты в итоге сделал-то ? Как удалось проблему решить? MZ>Выдрал точки входа dumpbin-ом и сделал .def файл, а потом его скормил MZ>lib-у ?