|
|
|
Создание и использование DLL
|
|||
|---|---|---|---|
|
#18+
Всех приветствую. Я недавно начал программировать на С++ и вот понадобилось создать DLL, но при запуске приложения, использующего созданную библиотеку возникает ошибка и приложение аварийно закрывается. Подскажите, пожалуйста, что не так. Программирую в DevCpp. Создал простейшую DLL: dllmain.cpp: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. Вот код программы, использующей DLL (dll.h - это тот же файл) uselibr.cpp: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. Прошу помощи. И благодарен за ответы ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2007, 13:00 |
|
||
|
Создание и использование DLL
|
|||
|---|---|---|---|
|
#18+
Ivan AleksandrovichВсех приветствую. Я недавно начал программировать на С++ и вот понадобилось создать DLL, но при запуске приложения, использующего созданную библиотеку возникает ошибка и приложение аварийно закрывается. Подскажите, пожалуйста, что не так. Программирую в DevCpp. Создал простейшую DLL: dllmain.cpp: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. Вот код программы, использующей DLL (dll.h - это тот же файл) uselibr.cpp: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. Прошу помощи. И благодарен за ответы Ну так нету у тебя функции Mess... И никакой другой функции нет по этому адресу... Это то же самое, что работать с массивом через указатели... По-моему, должно быть так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2007, 13:43 |
|
||
|
Создание и использование DLL
|
|||
|---|---|---|---|
|
#18+
Ну знаешь ли... Код: plaintext Посмотри функции LoadLibrary, GetProcAddress. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2007, 13:45 |
|
||
|
Создание и использование DLL
|
|||
|---|---|---|---|
|
#18+
Пока носом не ткнут сам не увижу... видимо уже запарился, ибо глупая ошибка. Во первых спасибо за ответы. А во вторых... Ой ВэйНу знаешь ли... Код: plaintext Загружать библиотеку через LoadLibrary уже научился чуть ранее. Вот этот код работает: Код: plaintext 1. 2. 3. 4. 5. Станислав СНу так нету у тебя функции Mess... И никакой другой функции нет по этому адресу... Это то же самое, что работать с массивом через указатели... Добавл соответствующую строчку. Хотелось бы слинковать используя либы. А вот ошибка все равно остается: Код: plaintext Пробовал также изменить файл libr.h, добавив extern "C": Код: plaintext 1. 2. 3. 4. Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2007, 19:39 |
|
||
|
Создание и использование DLL
|
|||
|---|---|---|---|
|
#18+
Выдача tdump: . . . ****************************************************************************** Section: Exports Flags: 00000000 Time Stamp: 45C0B4CD : Wed Jan 31 18:25:01 2007 Major Version: 0000 Minor Version: 0000 Exports from libr.dll 1 exported name(s), 1 export addresse(s). Ordinal base is 1. Not sorted RVA Ord. Hint Name -------- ---- ---- ---- 000011D0 1 0000 HelloWorld ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2007, 20:32 |
|
||
|
Создание и использование DLL
|
|||
|---|---|---|---|
|
#18+
Давай не путать LoadLibrary/GetProcAddress и Код: plaintext В первом случае необходимо объявить функцию в файле def, в разделе EXPORTS — просто написать имя функции: Код: plaintext 1. Тогда её можно будет загрузить по обычному (недекорированному) имени. Во втором случае ни LoadLibrary, ни GetProcAddress не нужны (не необходимы). Надо подключить файл *.h с прототипом функции, чтобы отработал транслятор. А потом слинковаться с *.lib, тогда а) линкер распознает функцию; б) при запуске ехе сам подгрузит dll. Получилось? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.02.2007, 12:34 |
|
||
|
Создание и использование DLL
|
|||
|---|---|---|---|
|
#18+
Ivan Aleksandrovich....Прошу помощи. И благодарен за ответы свои пять копеек... существует понятие явная и не явная загрузка дэлеле. Явно - когда Вы сами грузите её и просите - дай-ка мне удресс вот на эту вот хренотень...Имя хренотени должно совпадать с тем именем что экспортирует дэлеле (про дэф файл ужо прозвучало). НЕ ЯВНО - когда за Вас всю работу берёт О'могущественный компилятор (уж лучше бы он это иногда и не делал!). Т.е. Вам досаточно указать в коде ашничек с описанием той хренотени что Вам нужна (ну например класс) и сказать линковщику - скушайка браток либу, в которой ты надёшь имя дэлеле которую нуна грузить, а так же имя по которому ты там найдёшь хренотень из ашничка....Код загрузки дэлеле и взятие необходимого Вам адреса (и прописывание во все ссылочные места Вашего кода) - будет сделано без Вашего участия, в фоновом режиме... несколько слов об встречающихся ошибках... 1) Ни фига не пойму, что это за символы, что это за хренотень в коде? Ошибка компилятора...(кусок Вашего кода ничего не знает об Ваших тайных помыслах заюзать некий класс или некую другую хренотень). Необходимо просто подключить ашничек выше того места, где Вы впервые упамянули Вашу хренотень. 2) Не могу найти, после всех компиляций, ответ - где же взять мне эту хренотень с именем "бла-бла-бла" на которую ссылаются в модуле "бла-бла-бла". Ошибка линковщика... (собственно линковщик рад бы Вам помочь, но перерывать все диски-флэшки-локальную сеть ему как то в лом...). Необходимо линковщику дать на вход путя и имя либы, где описана Ваша хренотень. 3) Грузюсь, но чегой-то не хватает. Первое, что не вижу - модуль "бла-бла-бла". Посему - шли бы Вы подальше...(при попытке создать процесс программы и загрузить все модули на которые есть ссылка в бинарнике и дэлелельках - не увенчались успехом. Бинарник - это часть айсберга того хвоста что тащиться вместе с ним. Часто происходит у начинающих программеров, которые предпологают что на всех компах стоит девелопер студия.) Один раз записать аккуратно на листок все модули которые треба и поставлять со своим программным продуктом. Либо дружить с прогой типа дэпендисис и внимать её советам в ввиде ссылок на другие модули... с уважением (круглый) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.02.2007, 13:10 |
|
||
|
Создание и использование DLL
|
|||
|---|---|---|---|
|
#18+
Давно не заходил... авторДавай не путать LoadLibrary/GetProcAddress и слинковать используя либы Да я и не путаю. Говоря "слинковать используя либы" я имел в виду подключение .h и .lib. Разумеется без LoadLibrary и GetProcAddress. автор Код: plaintext Либу тоже подключил. Но линкер все равно обругал: автор Код: plaintext И вот тут я уже развожу руки. Специально не поленился, поставил "кривую" MSVC. Он всю эту ерунду собрал без лишней ругани. Поэтому вопрос именно в том, как правильно собирать в DevCpp - mingw. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.02.2007, 16:05 |
|
||
|
Создание и использование DLL
|
|||
|---|---|---|---|
|
#18+
Ну где там можно заблудится? Для гнуси библиотека импорта вообще не нужна. Вот, делаем dll на mingw: 1) делаем: add.c Код: plaintext 1. 2. gcc -c -o add.o add.c 3) повторяем шаги 1 и 2 для всех модулей 4) собираем dll: gcc -shared -o arithemtic.dll *.o Теперь используем ее из C++. 1) Пишем test.cpp Код: plaintext 1. 2. 3. 4. 5. 6. 7. g++ -c -o test.o test.c 3) и собираем exe со статической линковкой на arithemtic.dll: g++ -o test.exe -d arithemtic.dll test.o 4) Запускаем test.exe - радуемся 5) Удаляем arithemtic.dll - запускаем test.exe, программа падает с ошибкой что не может найти dll. радуемся еще больше. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.02.2007, 00:48 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=34297540&tid=2029479]: |
0ms |
get settings: |
7ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
187ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
52ms |
get tp. blocked users: |
1ms |
| others: | 224ms |
| total: | 506ms |

| 0 / 0 |
