![]() |
|
|
![]()
|
|
| kometa_triatlon |
|
||||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 384 Регистрация: 7.1.2005 Где: Киев Репутация: 1 Всего: 6 |
Есть проект, использующий неявное подключение ДЛЛ.
В класс dll запихнул нужные мне функции, приложение получает результат работы через вспомогательную функцию. Вроде все ничего, но как обычно, в дебаге работает нормально, в версии release не билдится Получаю следующее:
Некоторые части кода вот: Объявление импортируемой функции:
В dll:
Проблема конечно более чем распространенная, но в поиске не нашел... Может мне как-то переписать код? -------------------- Всё очень просто: сказки обман, Солнечный остров скрылся в туман, Замков воздушных не носит земля, Кто-то ошибся, ты или я. -------------- Программирование - самое большое удовольствие, которое вы можете получить, будучи одетым. |
||||||||
|
|||||||||
| AlexPro |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 157 Регистрация: 9.11.2005 Где: Санкт-Петербург Репутация: 3 Всего: 4 |
Если склероз мне не изменяет, в свое время у меня у меня тоже было нечто подобное, сейчас использую def-файл для экспортируемых функций - работает на ура.
|
|||
|
||||
| nikf |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 127 Регистрация: 6.6.2005 Где: город-герой Жирно вск Репутация: 1 Всего: 1 |
дело не в коде. линкер видит объявленную функцию в h файле, но не видит ее реализации... где-то потерялись твоя dll... или забыл подсоединить библиотеку импорта .lib. просто повнимательнее посмотри. dll должна быть в папке куда компилишь релиз екзешника.
Добавлено @ 07:48 или в релизие твоему екзешнику попадается старая версия dll не содержащая данной функции |
|||
|
||||
| kometa_triatlon |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 384 Регистрация: 7.1.2005 Где: Киев Репутация: 1 Всего: 6 |
А ведь точно, я в дебаге настроил директории, указал путь к библиотеке импорта, думал, что для релиза эти настройки сохранятся, оказалось все не так радужно...
Спасибо nikf за трезвую идею -------------------- Всё очень просто: сказки обман, Солнечный остров скрылся в туман, Замков воздушных не носит земля, Кто-то ошибся, ты или я. -------------- Программирование - самое большое удовольствие, которое вы можете получить, будучи одетым. |
|||
|
||||
| En_t_end |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2074 Регистрация: 4.12.2004 Репутация: 2 Всего: 20 |
kometa_triatlon
Если я тебя правильно понял, то советую в таком случае все либы подключать прямо, а не в настройке проекта... #pragma comment(lib,"some.lib") |
|||
|
||||
| kometa_triatlon |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 384 Регистрация: 7.1.2005 Где: Киев Репутация: 1 Всего: 6 |
En_t_end
Ок, но у меня output directory для проекта dll-ки указана не как обычно, а на уровень выше. Как это можно указать в коде? -------------------- Всё очень просто: сказки обман, Солнечный остров скрылся в туман, Замков воздушных не носит земля, Кто-то ошибся, ты или я. -------------- Программирование - самое большое удовольствие, которое вы можете получить, будучи одетым. |
|||
|
||||
| AlexPro |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 157 Регистрация: 9.11.2005 Где: Санкт-Петербург Репутация: 3 Всего: 4 |
Очень даже радужно |
|||
|
||||
| DeadSoul |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1217 Регистрация: 25.9.2005 Где: Москва Репутация: 2 Всего: 11 |
kometa_triatlon, была такая бага. Долго пиииииииииииииип. У тебя неправильно(а вернее по разному) указаны настройки проекта в dll и exe. Нужно выставить одинаковыми:
- Project -> Properties -> General -> Character Set - Project -> Properties -> C\C++ -> Language -> Treat wchar_t as build-in type -------------------- Если Вы получили ответ на Ваш вопрос, то нажмите на "Вопрос решен". Бьем спамеров их же оружием. Пусть весь спам сыпется им [email protected] |
|||
|
||||
| kometa_triatlon |
|
||||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 384 Регистрация: 7.1.2005 Где: Киев Репутация: 1 Всего: 6 |
Вопрос в догонку: как экспортировать из библиотеки только один метод класса:
Я сделал так: объявил в библиотеке экспортируемую функцию
но она только вызывает метод класса:
Почитал МСДН, переделал так:
Но не пойму теперь как обьявить этот метод для клиента, раньше было просто:
Если оставить как есть, получаю unresolved, заменяю __declspec (dllimport) на AFX_EXT_CLASS то же самое Что-то не нашел в МСДН такого... -------------------- Всё очень просто: сказки обман, Солнечный остров скрылся в туман, Замков воздушных не носит земля, Кто-то ошибся, ты или я. -------------- Программирование - самое большое удовольствие, которое вы можете получить, будучи одетым. |
||||||||
|
|||||||||
| bel_nikita |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Эксперт Сообщений: 2304 Регистрация: 12.10.2003 Где: Поезд №21/22 ( ст . Прага ) Репутация: 2 Всего: 47 |
kometa_triatlon
Что в препроцессоре прописано? Чтобы экспортировать MFC класы из DLL - она должна быть MFC extension DLL. |
|||
|
||||
| kometa_triatlon |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 384 Регистрация: 7.1.2005 Где: Киев Репутация: 1 Всего: 6 |
bel_nikita
Ту проблему я уже решил Я так понял, если я экспортирую только один метод класса, все равно DLL должна быть расширенной? -------------------- Всё очень просто: сказки обман, Солнечный остров скрылся в туман, Замков воздушных не носит земля, Кто-то ошибся, ты или я. -------------- Программирование - самое большое удовольствие, которое вы можете получить, будучи одетым. |
|||
|
||||
| bel_nikita |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Эксперт Сообщений: 2304 Регистрация: 12.10.2003 Где: Поезд №21/22 ( ст . Прага ) Репутация: 2 Всего: 47 |
Что значит экспортировать метод класса??? Можно либо весь класс экспортировать, либо неклассовые методы, либо переменные. |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
bel_nikita ты абсолютно не прав...
Можно экспортировать как все методы класса, так и только выбранные. В первом случае спецификация экспорта-импорта ставится в определении класса, во- втором - только в определении метода, как в примере у kometa_triatlon.
Нет, не в этом дело. Просто когда визард создает extension DLL, он добавляет символ препроцессора _AFXEXT, а этот символ нужен для правильной интерпретации символов AFX_EXT_CLASS и т.д. Т.е., если есть _AFXEXT, то AFX_EXT_CLASS == declspec(dllimport), в противном случае - export. Можешь сам таких символов сочинить для каждой своей DLL, не важно, extension или нет. -------------------- ... |
|||
|
||||
| bel_nikita |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Эксперт Сообщений: 2304 Регистрация: 12.10.2003 Где: Поезд №21/22 ( ст . Прага ) Репутация: 2 Всего: 47 |
Точно. Век живи - век учись
|
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
Совершенно не обязательно, если ты не конструируешь объект в клиентском коде, а, скажем, получаешь ссылку на готовый объект. Короче, что вызывается в клиенте, то и нужно экспортировать. Спасибо тебе за репу. -------------------- ... |
|||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Visual C++/MFC/WTL | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |