(C++) Работа с Dll библиотеками.
От: stribog  
Дата: 16.05.10 16:00
Оценка:
У меня такая ситуация, я хочу написать программу, которая использует dll библиотеку, взял отсюда _http://slesh.name/?act=releases

Компилирую в VS, при компиляции не находи функции библиотеки, да и вообще походу ее не регистрирует.

Долго мучился и решил написать сюда. (почитал статьи из инета, ничего подходящего не нашел)
Подскажите где ТОЛКОВО написано об этом, можно пример, желательно на VS.

ps раньше у меня получалось работать с dll, но вот конкретно с этой библиотекой ничего поделать не могу...
Пробовал lib файл подключать, как бы файл находит, но библиотеку не регистрирует, DllMain не выполняется.

Короче ужас какой то =)

Помогите, может у кого есть ссылка на нормальную статью по моей теме (желательно из книги), был бы рад примеру (особенно если бы пример касался IcqMod.DLL).
dll c++ cpp с++.
Re: (C++) Работа с Dll библиотеками.
От: MasterZiv СССР  
Дата: 18.05.10 10:55
Оценка:
stribog пишет:

> Компилирую в VS, при компиляции не находи функции библиотеки,


Её надо указать в проекте, в опциях линкера. Как -- это зависит
от системы сборки (я не знаю).

да и
> вообще походу ее не регистрирует.

А где её по твоему мнению надо регистрировать ?

> Подскажите где ТОЛКОВО написано об этом, можно пример, желательно на VS.


О чём ?

> Пробовал lib файл подключать, как бы файл находит, но библиотеку не

> регистрирует, DllMain не выполняется.

Где ты её хочешь регистрировать, ещё раз ?
Posted via RSDN NNTP Server 2.1 beta
Re[2]: (C++) Работа с Dll библиотеками.
От: stribog  
Дата: 18.05.10 13:27
Оценка:
Здравствуйте, MasterZiv, Вы писали:

MZ>А где её по твоему мнению надо регистрировать ?


Ну, по видимому в системе.

MZ>О чём ?


Ну как о чем? Название темы говорит само за себя.

>> Пробовал lib файл подключать, как бы файл находит, но библиотеку не

>> регистрирует, DllMain не выполняется.

MZ>Где ты её хочешь регистрировать, ещё раз ?


В системе, на счет либ файлов не знаю регистрирует ли их как dll.

Попытаюсь перефразировать вопрос.

Как из библиотеки вычитать все функции ее? и возможно ли потом использовать их, не зная устройства (функций).

И если я знаю их устройство, объявил их
.... ULONG _stdcall ICQSendMsg(PICQ_CLIENT client, char * UIN, char * msg); ....

Но при исполнении кода он не находит вызываемую функцию, в чем проблема? Может ли она быть в описании функции? или это почти гарантированно говорит о том, что функция найдена в библиотеке, или сама библиотека не загружена, можно что-то однозначно сказать по этому поводу?
dll c++ cpp
Re: (C++) Работа с Dll библиотеками.
От: Кодт Россия  
Дата: 18.05.10 13:29
Оценка: 3 (1) +1
Здравствуйте, stribog, Вы писали:

S>У меня такая ситуация, я хочу написать программу, которая использует dll библиотеку, взял отсюда _http://slesh.name/?act=releases

S>Компилирую в VS, при компиляции не находи функции библиотеки, да и вообще походу ее не регистрирует.

Регистрировать её не надо. Надо сделать правильный .lib-файл к данной .dll. Почему автор библиотеки поленился опубликовать его — загадка.

Теоретически, это делается так
Смотришь dumpbin icqmod.dll /exports , что экспортирует DLL.
Исходя из этого, пишешь .def-файл
LIBRARY "IcqMod.dll"
EXPORTS
  ICQAuth @1
  ICQClose @2
  ICQConnect @3
  ICQReadMsg @4
  ICQSendAuth @5
  ICQSendMsg @6

Напускаешь на него библиотекаря: 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-сервер.
Перекуём баги на фичи!
Re[2]: (C++) Работа с Dll библиотеками.
От: Кодт Россия  
Дата: 18.05.10 13:31
Оценка: 1 (1)
К>Регистрировать её не надо. Надо сделать правильный .lib-файл к данной .dll. Почему автор библиотеки поленился опубликовать его — загадка.

У борланда, говорят, для этого есть утилита implib (implib32)
В интернете также встречаются шароварные утилиты, рожающие .lib и (если это возможно, .h) из .dll
Попробуй, вдруг повезёт.
Перекуём баги на фичи!
Re[2]: (C++) Работа с Dll библиотеками.
От: stribog  
Дата: 18.05.10 13:41
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Регистрировать её не надо. Надо сделать правильный .lib-файл к данной .dll. Почему автор библиотеки поленился опубликовать его — загадка.


На том же сайте есть исходники библиотеки, и скомпилировав их получается .lib файл. Но функции все равно не видит....

Еще хотел уточнить, при неявном подключении библиотеки через .lib -файл в ОС dll-ка не регистрируется,а при явном подключении через LoadLibrary("IcqMod.dll"); он ее обязательно регистрирует, и запускает при этом DllMain ? так?
Re[3]: (C++) Работа с Dll библиотеками.
От: Кодт Россия  
Дата: 18.05.10 14:11
Оценка: 1 (1)
Здравствуйте, stribog, Вы писали:

S>На том же сайте есть исходники библиотеки, и скомпилировав их получается .lib файл. Но функции все равно не видит....


Я бы поступил проще. Выкинул оттуда DllMain, и добавил исходник .cpp в твой проект.
Всё, что потребуется от тебя — вызвать в main() / WinMain() инициализацию винсока — как это было сделано в DllMain.
(Кстати, это ещё вопрос — можно ли из DllMain инициализировать винсок).

Ради 6 килобайт морочиться с DLL смысла нет.

S>Еще хотел уточнить, при неявном подключении библиотеки через .lib -файл в ОС dll-ка не регистрируется,а при явном подключении через LoadLibrary("IcqMod.dll"); он ее обязательно регистрирует, и запускает при этом DllMain ? так?


Нужно убрать фантазии и домыслы про "регистрируется". Ты какой-то особый смысл в это вкладываешь, а у меня телепатия буксует.

Обычно "регистрируется" означает "прописывает в реестр информацию о COM-сервере", чтобы потом можно было создавать COM-объекты, не обращаясь к DLL напрямую (система сама её найдёт, загрузит и вызовет нужные функции у фабрики классов).

В любом случае, при загрузке DLL в процесс, будь то ранняя, отложенная или явная (с помощью LoadLibrary), вызывается DllMain.
Перекуём баги на фичи!
Re[2]: (C++) Работа с Dll библиотеками.
От: stribog  
Дата: 18.05.10 17:44
Оценка:
Кодт, Спасибо тебе!! Все получилось!

Но, все-таки, может кто-нибудь скажет где можно почитать про работу с Dll библиотеками (очень подробно).
Re[4]: (C++) Работа с Dll библиотеками.
От: stribog  
Дата: 18.05.10 17:49
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Я бы поступил проще. Выкинул оттуда DllMain, и добавил исходник .cpp в твой проект.

К>Всё, что потребуется от тебя — вызвать в main() / WinMain() инициализацию винсока — как это было сделано в DllMain.
К>(Кстати, это ещё вопрос — можно ли из DllMain инициализировать винсок).

К>Ради 6 килобайт морочиться с DLL смысла нет.


Это идея у меня была, я её оставил на самый крайний вариант, но сейчас уже все нормально. Спасибо тебе еще раз!
Re[3]: (C++) Работа с Dll библиотеками.
От: dabeat_bf Украина http://alexmogurenko.com
Дата: 18.05.10 17:54
Оценка: +1
Здравствуйте, stribog, Вы писали:

S>Но, все-таки, может кто-нибудь скажет где можно почитать про работу с Dll библиотеками (очень подробно).

S>

Джеффри Рихтер "Windows для профессиоалов" Часть 4
Re[3]: (C++) Работа с Dll библиотеками.
От: MasterZiv СССР  
Дата: 19.05.10 10:02
Оценка:
stribog пишет:
> MZ>А где её по твоему мнению надо регистрировать ?
>
> Ну, по видимому в системе.

Ненужно ничего регистрировать в системе.

> В системе, на счет либ файлов не знаю регистрирует ли их как dll.


*.lib тоже нигде в системе регистрировать ненадо.

> Как из библиотеки вычитать все функции ее?


Из .dll в общем случае никак. Из .lib -- просто указать её
линкеру, он сам всё возмёт.

и возможно ли потом
> использовать их, не зная устройства (функций).

Невозможно.


> Но при исполнении кода он не находит вызываемую функцию, в чем проблема?


Кто где что не находит ?

> Может ли она быть в описании функции?


Может.

или это почти гарантированно
> говорит о том, что функция найдена в библиотеке, или сама библиотека не
> загружена, можно что-то однозначно сказать по этому поводу?

Пока можно гарантированно скзать, что ты как-то с С работать не очень умеешь.
Это азы. И это от того, dll это или нет, не зависит.
И совсем не понятно, при чём тут такие проблемы, если на сайте всё для
девелопинга с этой либой лежит (вроде бы как).
Posted via RSDN NNTP Server 2.1 beta
Re[3]: (C++) Работа с Dll библиотеками.
От: MasterZiv СССР  
Дата: 19.05.10 11:13
Оценка:
stribog пишет:

> Кодт, Спасибо тебе!! Все получилось!


Чё у тебя там получилось я не понимаю.
Вообще там на сайте исходники лежат.
Posted via RSDN NNTP Server 2.1 beta
Re[3]: (C++) Работа с Dll библиотеками.
От: Odi$$ey Россия http://malgarr.blogspot.com/
Дата: 19.05.10 17:26
Оценка: 3 (1)
Здравствуйте, stribog, Вы писали:

S>Кодт, Спасибо тебе!! Все получилось!


S>Но, все-таки, может кто-нибудь скажет где можно почитать про работу с Dll библиотеками (очень подробно).


http://rsdn.ru/summary/229.xml
... << RSDN@Home 1.2.0 alpha 4 rev. 1429>>
Re: (C++) Работа с Dll библиотеками.
От: ShaggyOwl Россия http://www.rsdn.org
Дата: 20.05.10 05:52
Оценка: 3 (1) +1
Здравствуйте, stribog, Вы писали:

S>Помогите, может у кого есть ссылка на нормальную статью по моей теме (желательно из книги), был бы рад примеру


http://www.rsdn.ru/res/book/win32/winpro.xml
Автор(ы): Джеффри Рихтер
Это издание — практически новая книга, посвещенная программированию серьезных приложений на Microsoft Visual C++ в операционных системах Windows 2000 (32- и 64-разрядных версиях) и Windows 98 с использованием функций Windows API. Состоит из 27 глав, двух приложений и предметного указателя. Гораздо глубже, чем в предыдущих изданиях рассматриваются такие темы, как взаимодействие с операционной системой библиотеки C/C++, программирование DLL и оптимизация кода, описываются новые механизмы и функции, появившиеся в Windows 2000, и приводится информация, специфическая для 64-разрядной Windows 2000. В этом издании автор, перейдя с языка C на C++, переработал все программы-примеры и представил ряд новых приложений, например ProcessInfo и LISWatch. Также появились совершенно новые материалы: выравнивание данных, привязка потоков к процессорам, кэш-линии процессоров, архитектура NUMA, перехват API-вызовов и др. Книга предназначена профессиональным программистам, владеющим языком C/C++ и имеющим опыт разработки Windows-приложений. Прилагаемый компакт-диск содержит все программы из книги (исходный код и исполняемые файлы для процессоров x86, IA-64 и Alpha).

Джеффри РИХТЕР
Создание эффективных WIN32-приложений с учетом специфики 64-разрядной версии Windows
ЧАСТЬ IV ДИНАМИЧЕСКИ ПОДКЛЮЧАЕМЫЕ БИБЛИОТЕКИ
ГЛАВА 19 DLL основы


Язык простой. Написано все по делу. Рекомендую.
Хорошо там, где мы есть! :)
Re[3]: (C++) Работа с Dll библиотеками.
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 20.05.10 15:30
Оценка:
Здравствуйте, 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); ....
Или, для нескольких:
#ifdef __cplusplus
extern "C" {
#endif

ULONG _stdcall ICQSendMsg(PICQ_CLIENT client, char * UIN, char * msg);
...

#ifdef __cplusplus
}
#endif


S>Но при исполнении кода он не находит вызываемую функцию, в чем проблема? Может ли она быть в описании функции? или это почти гарантированно говорит о том, что функция найдена в библиотеке, или сама библиотека не загружена, можно что-то однозначно сказать по этому поводу?


При исполнении? т.е. линковка проходит?
Маньяк Робокряк колесит по городу
Re[4]: (C++) Работа с Dll библиотеками.
От: stribog  
Дата: 20.05.10 16:05
Оценка:
Здравствуйте, MasterZiv, Вы писали:

MZ>Чё у тебя там получилось я не понимаю.

MZ>Вообще там на сайте исходники лежат.

Да я в курсе насчет исходников (про это кстати говорилось выше). А получилось все что хотел =)
Re[5]: (C++) Работа с Dll библиотеками.
От: MasterZiv СССР  
Дата: 22.05.10 06:21
Оценка:
stribog пишет:

> MZ>Чё у тебя там получилось я не понимаю.

> MZ>Вообще там на сайте исходники лежат.
>
> Да я в курсе насчет исходников (про это кстати говорилось выше). А
> получилось все что хотел =)

Так нафига сомнительным образом получать библиотеку импорта из .dll,
если можно взять исходники и собрать и .dll, и библиотеку импорта?
И чего ты людям голову морочил -- не понятно.
Posted via RSDN NNTP Server 2.1 beta
Re[6]: (C++) Работа с Dll библиотеками.
От: stribog  
Дата: 22.05.10 12:51
Оценка:
Здравствуйте, MasterZiv, Вы писали:

MZ>stribog пишет:


MZ>Так нафига сомнительным образом получать библиотеку импорта из .dll,

MZ>если можно взять исходники и собрать и .dll, и библиотеку импорта?
MZ>И чего ты людям голову морочил -- не понятно.

Дак в том то и дело, когда я сам собираю библиотеку и включаю ее .lib файл, то он не находит функций...
Re[7]: (C++) Работа с Dll библиотеками.
От: MasterZiv СССР  
Дата: 22.05.10 14:22
Оценка:
stribog пишет:

> Дак в том то и дело, когда я сам собираю библиотеку и включаю ее .lib

> файл, то он не находит функций...

Да быть такого не может. Ты что-то значит неправильно делаешь.

Так, и что ж ты в итоге сделал-то ? Как удалось проблему решить?
Выдрал точки входа dumpbin-ом и сделал .def файл, а потом его скормил
lib-у ?
Posted via RSDN NNTP Server 2.1 beta
Re[8]: (C++) Работа с Dll библиотеками.
От: stribog  
Дата: 23.05.10 09:01
Оценка:
Здравствуйте, MasterZiv, Вы писали:

MZ>stribog пишет:


>> Дак в том то и дело, когда я сам собираю библиотеку и включаю ее .lib

>> файл, то он не находит функций...

MZ>Да быть такого не может. Ты что-то значит неправильно делаешь.


MZ>Так, и что ж ты в итоге сделал-то ? Как удалось проблему решить?

MZ>Выдрал точки входа dumpbin-ом и сделал .def файл, а потом его скормил
MZ>lib-у ?

Пришлось динамически загружать библиотеку.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.