Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сборка XercesLib.dll в C++ Builder, Где в bpr указано, что подлежит экспорту 
:(
    Опции темы
CyraxZ
Дата 15.12.2006, 11:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 251
Регистрация: 10.12.2006

Репутация: нет
Всего: нет



Для сборки библиотеки XercesLib.dll вместе с сырцами имеются файл проекта .bpr и его .cpp. Файл .cpp следующий:
Код

#include <windows.h>
// комменты
#pragma argsused
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{ return 1;
}

В отдельном каталоге (xercesc) лежат все исходники. Включаемые в библиотеку cpp-ники включены в проект. И всё. В .cpp файла проекта не указано, что подлежит экспорту (текст выше). По умолчанию ни один из включенных в проект cpp-ников не включается в dll-ку.
Причём нигде в сырцах ничего подобного (об экспорте) тоже не указано (но так и должно быть). Т.е. информация об экспорте должна быть именно в файле проекта...
1. Вопрос: где в файле проекта указывается, что в dll'ку нужно включить объектный код всех подключенных к проекту cpp-ников ?
(нигде явного указания с помощью __declspec (dllexport) или как-то иначе нет)

2. Дело в том, что собранная XercesLib.dll корректно не юзается:
Кинул к своей проге XercesLib.lib и XercesLib.dll, включил в проект XercesLib. (Все нужные хидеры из используемых моей прогой сырцов подключил.) Компилю, запускаю. Прога выкидывает исключение EAccessViolation "Access Violation at address ... in module 'XERCESLIB.DLL' " на вызове любой функции из dll...
Это я что-то сделал не так или dll'ка собрана криво ?
dll'ка собрана согласно Builder'овскому С-соглашению, юзаю я её также по C-соглашению из Builder-программы (хотя, даже если заюзаю из MSVC-проги, то не должно быть проблем, т.к. при неявном подключении вызовы функций из dll происходят по номеру, а не по имени).

Для проверки создал dll'ку в Builder'е, как в случае с Xerces'ом, такой же cpp-ник (без указания, что нужно экспортировать) (текст выше). Включил в проект дополнительный cpp-ник с функцией, которую нужно экспортировать в dll. Собрал - объектного кода этой функции в dll нет, что очевидно. 
PM MAIL   Вверх
Vyacheslav
Дата 15.12.2006, 12:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: 47
Всего: 59



Цитата(CyraxZ @  15.12.2006,  11:48 Найти цитируемый пост)
1. Вопрос: где в файле проекта указывается, что в dll'ку нужно включить объектный код всех подключенных к проекту cpp-ников ?

Вопрос не понятен. В dll включается весь объектный код всех подключенных к проекту cpp-ников. Другой вопрос, что только часть из представленных там классов достпупны для пользования из вне 
.
Цитата(CyraxZ @  15.12.2006,  11:48 Найти цитируемый пост)
(нигде явного указания с помощью __declspec (dllexport) или как-то иначе нет)

Счас smile Практически большинство классов указаны, как экспортируемые
BorlandCDef.hpp
Код

#define PLATFORM_EXPORT     __declspec(dllexport)
#define PLATFORM_IMPORT     __declspec(dllimport)


В параметрах проекта имееем
Цитата

XML_PLATFORM_NEW_BLOCK_ALIGNMENT=4;PLATFORM_WIN32;_CRTDBG_MAP_ALLOC;
PROJ_XMLPARSER;PROJ_XMLUTIL;PROJ_PARSERS;PROJ_SAX4C;
PROJ_SAX2;PROJ_DOM;PROJ_VALIDATOR;
XML_SINGLEDLL;XML_USE_WIN32_TRANSCODER;XML_USE_INMEM_MESSAGELOADER;
XML_USE_NETACCESSOR_WINSOCK;_DEBUG;PROJ_DEPRECATED_DOM



А Xercesdefs.hpp
Код

if defined(PROJ_XMLUTIL)
#define XMLUTIL_EXPORT PLATFORM_EXPORT
#else
#define XMLUTIL_EXPORT PLATFORM_IMPORT
#endif

#if defined(PROJ_XMLPARSER)
#define XMLPARSER_EXPORT PLATFORM_EXPORT
#else
#define XMLPARSER_EXPORT PLATFORM_IMPORT
#endif

#if defined(PROJ_SAX4C)
#define SAX_EXPORT PLATFORM_EXPORT
#else
#define SAX_EXPORT PLATFORM_IMPORT
#endif

#if defined(PROJ_SAX2)
#define SAX2_EXPORT PLATFORM_EXPORT
#else
#define SAX2_EXPORT PLATFORM_IMPORT
#endif

#if defined(PROJ_DOM)
#define CDOM_EXPORT PLATFORM_EXPORT
#else
#define CDOM_EXPORT PLATFORM_IMPORT
#endif

#if defined(PROJ_DEPRECATED_DOM)
#define DEPRECATED_DOM_EXPORT PLATFORM_EXPORT
#else
#define DEPRECATED_DOM_EXPORT PLATFORM_IMPORT
#endif

#if defined(PROJ_PARSERS)
#define PARSERS_EXPORT  PLATFORM_EXPORT
#else
#define PARSERS_EXPORT  PLATFORM_IMPORT
#endif

#if defined(PROJ_VALIDATORS)
#define VALIDATORS_EXPORT  PLATFORM_EXPORT
#else
#define VALIDATORS_EXPORT  PLATFORM_IMPORT
#endif


Ну и возьмем любой класс
Код

 class XMLUTIL_EXPORT Match : public XMemory


Объявление которого, если раскрыть макрос банально превратиться в
Код

class __declspec(dllexport))  Match : public XMemory



--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
CyraxZ
Дата 16.12.2006, 15:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 251
Регистрация: 10.12.2006

Репутация: нет
Всего: нет



Насчёт макросов всё понятно.
Непонятно следующее:
1. Создал простую dll'ку, к проекту подключил модуль с несколькими экспортируемыми функциями. Собрал проект. Слежу за размером dll'ки (фактическим, не тем, сколько он занимает на диске): размер не изменяется при изменении числа разных функций в подключаемом cpp-файле, не изменяется также при изменении имплемента функций (размер постоянный - 11776 байт). Если убрать все функции из подключаемого cpp-файла (оставить его пустым), то размер получаем 11264 байта.
С размерами lib-файла и объектника подключаемого cpp-ника - всё нормально (меняются, как и положено)
В чём дело ?
2. Почему прога, использующая dll'ку, нормально компилится независимо от того, как объявлена импортируемая из dll функция: с __declspec(dllexport), с __declspec(dllimport) или вообще без этого keyword'а ?  Должна компилиться только в случае с import...

3. И такой вопрос по Builder'у:
На что влияет настройка проекта Advanced compiler -> calling convention ?
Если на способ вызова функций из dll ?  Если так, то при неявном подключении эта информация может извлекаться из соответствующей lib-библиотеки...
Или на способ компиляции функций программы ?
PM MAIL   Вверх
Vyacheslav
Дата 17.12.2006, 23:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: 47
Всего: 59



Я не понял сути. То есть вы подключаете dll и используете  несколько функций из нее? И при изменении  количества используемых функций размер не растет? А почему он будет расти? Реализация импортируемых из dll функций в ваш проет не переносится. Они как были так и остались в dll. А от того сколько Вы функций вызвали размер Вашего проекта будет расти весьма незаметно. Вы же понимаете, что для нормальной работы Вашей пргограммы Вам обязательно нужно поставлять и ту dll, функции из которой Вы используете.    

Цитата(CyraxZ @  16.12.2006,  15:12 Найти цитируемый пост)
2. Почему прога, использующая dll'ку, нормально компилится независимо от того, как объявлена импортируемая из dll функция: с __declspec(dllexport), с __declspec(dllimport) или вообще без этого keyword'а ?  Должна компилиться только в случае с import...

Не думаю, что это возможно. Вы просто что-то напутали.  Или Вы это насчет компиляции? Тогда да. Компилиться все будет нормально. Вот линковщик будет ругаться 



--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0605 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.