0 / 0 / 1
Регистрация: 08.04.2014
Сообщений: 16
|
||||||
1 | ||||||
Динамическое подключение DLL03.05.2014, 20:42. Показов 6950. Ответов 14
Метки нет (Все метки)
Здравствуйте! Скорее всего, мой вопрос покажется вам глупым, но всё же... Я не могу динамически подключить библиотеку. Когда подключаю статически, всё работает, функция выдает ответ и все счастливы. Но когда начинаю подключать статически, в момент вызова функции программа ломается, выдавая: Необработанное исключение по адресу 0x776B1A91 в DetCalcDynamic.exe: 0xC0000005: нарушение прав доступа при исполнении по адресу 0x00000000.
0
|
03.05.2014, 20:42 | |
Ответы с готовыми решениями:
14
Динамическое подключение VC++ (2012) DLL в приложении C++Builder (RAD XE5) Динамическое связывание DLL Динамическое подключение библиотек C++ MinGW Динамическое подключение DLL, которая в свою очередь использует другие DLL |
Ушел с форума
|
|
03.05.2014, 21:10 | 2 |
Вариант 1.
Функция в dll использует одно соглашение о вызовах (например, _stdcall), а в клиентском коде подразумевается другое (например, _cdecl). Вариант 2. GetProcAddress завершается с ошибкой, потому что такой функции в dll все-таки нету. Но Вы это не проверяете (кстати, почему ?), поэтому ошибка пробрасывается дальше, в строку 3 (кстати, не проверять ошибки - опасная практика). Судя по тексту сообщения (нарушение прав доступа при исполнении по адресу 0x00000000), склоняюсь в сторону варианта 2.
1
|
0 / 0 / 1
Регистрация: 08.04.2014
Сообщений: 16
|
|
03.05.2014, 21:13 [ТС] | 3 |
Хм... чтобы проверить нашла ли программа dll достаточно проверить дескриптор на не NULL, а как можно проверить найдена ли сама функция? Не могли бы вы, пожалуйста, подсказать И насчет первого варианта, как его можно проверить?
0
|
Ушел с форума
|
|
03.05.2014, 21:19 | 4 |
Проверьте, что возвращает GetProcAddress. В случае ошибки будет NULL.
Подробная информация тогда ищется в GetLastError. Вы уверены, что функция точно называется Calculate, а не, к примеру, _Calculate@8 или как-нибудь еще ? Компиляторы любят искажать имена при экспорте из dll, и не все вьюеры правильно их показывают. Подсказка: используйте dumpbin (есть в Windows SDK / Visual Studio), он-то уж точно покажет экспортируемые из dll имена, точь в точь.
1
|
0 / 0 / 1
Регистрация: 08.04.2014
Сообщений: 16
|
|
03.05.2014, 21:23 [ТС] | 5 |
Не думаю, что она как-то еще называется. Просто если я подключаю в этом же проекте dll статически, то есть заголовочный файл подключаю, включаю в проект lib-файл и вызываю функцию Calculate, то всё прекрасно отрабатывает
Спасибо, посмотрю
0
|
Ушел с форума
|
|
03.05.2014, 21:33 | 6 |
Когда функция экспортируется из dll, компоновщик может присвоить
ей какое-то особое имя. Например, добавить ведущее подчеркивание, различные символы по краям и т.п. При статической компоновке и для библиотеки, и для клиентского кода, который ее использует, все это прозрачно. А вот при динамической загрузке, когда вы сами зовете LoadLibrary и GetProcAddress, становится важным указывать точное имя экспорта. В общем, если загрузите сюда вашу dll-ку, я покажу все, что написал выше, на практике.
1
|
0 / 0 / 1
Регистрация: 08.04.2014
Сообщений: 16
|
|
03.05.2014, 21:42 [ТС] | 7 |
О, спасибо большое, буду очень благодарен
0
|
Ушел с форума
|
|
03.05.2014, 21:46 | 8 |
Сообщение было отмечено Goido Kodaka как решение
Решение
Препарируем "пациента":
dumpbin.exe /EXPORTS /RAWDATA:NONE DetFunctions.dll Код
Microsoft (R) COFF/PE Dumper Version 9.00.30729.01 Copyright (C) Microsoft Corporation. All rights reserved. Dump of file D:\System\SharedFolder\DetFunctions.dll File Type: DLL Section contains the following exports for DetFunctions.dll 00000000 characteristics 536507B2 time date stamp Sat May 03 18:13:54 2014 0.00 version 1 ordinal base 3 number of functions 3 number of names ordinal hint RVA name 1 0 00011087 ?Calculate@@YAHQAY0BE@HH@Z 2 1 00011186 ?CalculateDeterminator@@YAHQAY0BE@HHHH@Z 3 2 00011096 ?Odd@@YA_NH@Z Summary 1000 .data 1000 .idata 2000 .rdata 1000 .reloc 1000 .rsrc 4000 .text 10000 .textbss ?Calculate@@YAHQAY0BE@HH@Z
1
|
0 / 0 / 1
Регистрация: 08.04.2014
Сообщений: 16
|
|
03.05.2014, 21:51 [ТС] | 9 |
Сам бы я никогда не догадался до такого... Да и гугл молчит... Теперь всё заработало Спасибо вам большое!
0
|
Ушел с форума
|
|
03.05.2014, 21:56 | 10 |
Только не говорите, что написали это имя (?Calculate@@YAHQAY0BE@HH@Z) в
GetProcAddress. Правильный способ решения таких проблем - делать экспорт так, чтобы имена не искажались. Это достигается с помощью DEF-файла. Правда, в этом случае с экспортом C++-классов возникнут затруднения, но тут уж приходится выбирать: или "странное" и непереносимое имя с потенциальными проблемами в будущем, или "чистый" экспорт, но с ограниченными возможностями.
0
|
0 / 0 / 1
Регистрация: 08.04.2014
Сообщений: 16
|
|
03.05.2014, 22:00 [ТС] | 11 |
Пойман с поличным
Можно поподробнее насчет этого? Не отказался бы от новых знаний
0
|
Ушел с форума
|
|
03.05.2014, 22:09 | 12 |
Ищите по форуму. Например: Как верно экспортить функцию?
И еще: Name Decoration http://msdn.microsoft.com/en-u... xefa7.aspx Calling Conventions http://msdn.microsoft.com/en-u... 2ssfy.aspx Exporting from a DLL http://msdn.microsoft.com/en-u... xe9k8.aspx
1
|
0 / 0 / 1
Регистрация: 08.04.2014
Сообщений: 16
|
|
03.05.2014, 22:10 [ТС] | 13 |
Спасибо еще раз, вы очень мне помогли
0
|
0 / 0 / 0
Регистрация: 11.08.2014
Сообщений: 4
|
||||||
11.08.2014, 23:16 | 15 | |||||
Делаю похожую задачу. Однако проблема другая. Функция из dll вызывается правильная. Можно даже зайти в нее через F11, но при попытке открытия COM порта с помощью CreateFile выпадает
0
|
11.08.2014, 23:16 | |
11.08.2014, 23:16 | |
Помогаю со студенческими работами здесь
15
Динамическое подключение dll dll динамическое подключение dll динамическое подключение DLL, динамическое подключение Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |