Поиск:

Ответ в темуСоздание новой темы Создание опроса
> проблема с dll, скомпилированной в Microsoft VS 
:(
    Опции темы
stas87
Дата 20.10.2009, 12:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



здравствуйте!
помогите решить проблему.

есть dll-ка, скомпилированная на продукте фирмы Майкрософт(VC++ or .NET)
в dll встрены классы. при обращении из среды разработки от Майкрософта - все работает нормально, все функции срабатывают.
при попытке вызвать те же самые методы из Borland C++ Builder 6.0 вылазит Access Violation, хотя адреса функций в dll-ке получает верные. Ошибка выпадает где то внутри самой библиотеки.
уже неделю мучаюсь, помогите пожалуйста.
PM MAIL   Вверх
Anikmar
Дата 20.10.2009, 14:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

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



ИМХО. Импортировать из DLL классы занятие нудное, противное и неблагодарное.
PM MAIL ICQ   Вверх
stas87
Дата 20.10.2009, 15:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



dll написана сторонней фирмой, исходников естесственно нет((, а борланд выбран из за того, что только на него есть лицензия
PM MAIL   Вверх
xvr
Дата 21.10.2009, 12:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



dll от VS с Borland'ом могут быть не совместимы, даже безо всяких классов (были преценденты). Проблема в разных CRT у основного приложения и DLL. В результате грузятся обе CRT (от MS и Borland'а), после чего они начинают драться из за общих ресурсов (типа stdin, stdout, и пр потроха libc), что обычно заканчивается крахом  smile 

PM MAIL   Вверх
stas87
Дата 21.10.2009, 15:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



ладно, спасибо.
скачал бесплатный компилятор от майкрософта - попробую на нем делать
PM MAIL   Вверх
Anikmar
Дата 21.10.2009, 16:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

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



Если в параметрах передаются структуры то может быть дело в банальном выравнивании.
PM MAIL ICQ   Вверх
stas87
Дата 23.10.2009, 05:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



на бесплатном компиляторе тоже не работает((

может какие особые настройки проетка надо указать?

вот заголовочный файл: 

Код


#ifdef AHM_EXPORTS
#define AHM_API extern "C" __declspec(dllexport)
#else
#define AHM_API extern "C" __declspec(dllimport)
#endif

namespace ahm {

...
    class Unit {
    public:
        ...
    };


    /**
     * The class HardwareModel gives access 
     * to the functionality of the abstract hardware model.
     * It mainly gives access to hardware units.
     *
     */    

    class HardwareModel {
    public:
        typedef enum eClassInfo { VERSION=2 } EClassInfo;
        /**
         *  Request access to a hardware unit.
         *  @param hardware unit locater (for example entry in hardware unit config DB)
         *  @return Unit object or 0 (if not available)
         */
     
        virtual ahm::Unit * getUnit(iop::string locatehw)=0;
        
        /**
         * dispose allocated resources for this hardware model
         * ATTENTION: Use this to free resources, when no longer needed.
         *            After dispose calls to the HardwareModel object may cause crashes.
         */
        virtual void dispose()=0;
        
        /**
        * Retrieve version string of hardware model 
        */        
        virtual iop::string version() = 0;
        
        /*** VERSION 2 ... */

        /** set file name of ahmconfig.xml */
        virtual void setConfigFileName(iop::string szfnConfig) = 0;
        /** set file name of ahmconfig.xml */
        virtual iop::string configFileName() = 0;
    };

....

}; // namespace ahm


/**
 * Published DLL entry point
 * Call this to get the singleton hardware model
 *
 */
AHM_API ahm::HardwareModel *  theHardwareModel();



тут вызывающий код:
Код


ahm::Unit* pRoot;
    HMODULE hLib;

    hLib = LoadLibrary("ahmcore.dll");
    if (hLib) {
        ahm::HardwareModel* (*hmf)(void);
        ahm::HardwareModel* hm;
        (FARPROC &) hmf = GetProcAddress(hLib, "theHardwareModel");
        if (hmf == NULL) return 0;
        hm = (*hmf)();
        if (hm == NULL) return 0;
        pRoot = hm->getUnit("DEMO-DMI6000B");
        if (pRoot != NULL) {
           
        }
    }




в полных майкрософтовских студиях pRoot = hm->getUnit("DEMO-DMI6000B"); возвращает значение, на борланде и VC++ 2008 Express Edition возвращает NULL

PM MAIL   Вверх
xvr
Дата 23.10.2009, 06:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Тогда только дебагер  smile 
PM MAIL   Вверх
stas87
Дата 23.10.2009, 22:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



дебагер - дело довольно геморойное.. тем более когда отсутствуют исходники длл..((
PM MAIL   Вверх
Anikmar
Дата 24.10.2009, 00:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

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



Цитата(stas87 @  23.10.2009,  05:42 Найти цитируемый пост)
в полных майкрософтовских студиях pRoot = hm->getUnit("DEMO-DMI6000B"); возвращает значение, на борланде и VC++ 2008 Express Edition возвращает NULL

А вообще что должен возвращать метод? Судя по описанию - пустой виртуальный...
PM MAIL ICQ   Вверх
stas87
Дата 28.10.2009, 09:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



метод должен возвращать ссылку на класс, при успешном его выполнеии
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

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

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

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

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


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

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


 




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


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

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