Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Портятся данные, при передаче в DLL 
:(
    Опции темы
Artemon
Дата 16.6.2009, 21:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


а ты мне нравишься
***


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

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



Написл DLL на VS2005 динамически загружаю ее из C++Builder 6.
Нормально вызываются экспортируемые ф-ии.

Проблема:

Одна из ф-ий возвращает указатель на объект моего класса, далее я работаю с этим указателем и вызываю его методы, проблема в том, что в методы приходят явно испорченные значения.

В чем может быть дело ?


--------------------
Контроль топлива на топливозаправщиках, мониторинг автотранспорта, расчет зарплаты водителей www.rscat.ru
PM MAIL   Вверх
Alexeis
Дата 16.6.2009, 21:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



Цитата(Artemon @  16.6.2009,  20:07 Найти цитируемый пост)
Одна из ф-ий возвращает указатель на объект моего класса, далее я работаю с этим указателем и вызываю его методы, проблема в том, что в методы приходят явно испорченные значения.

  А кто сказал что можно возвращать объекты из программы или из Dll? Сам класс в Dll и приложении это не один и тот же класс. Класс наверняка не экспортировался, разные модули по разному компилируют и собирают один и тот же код. Могут быть особенности оптимизации или же неявное использование RTTI или других встроенных механизмов. 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Artemon
Дата 17.6.2009, 05:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


а ты мне нравишься
***


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

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



Тогда как можно поступить в этом случае ?


--------------------
Контроль топлива на топливозаправщиках, мониторинг автотранспорта, расчет зарплаты водителей www.rscat.ru
PM MAIL   Вверх
chaos
Дата 17.6.2009, 06:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Серийный программист
****


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

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



Цитата(Alexeis @ 16.6.2009,  18:51)
А кто сказал что можно возвращать объекты из программы или из Dll? 

я говорю smile
в чем собственно проблема?

интерфейс о ктором знает и длл и апликация
Код

class driver_t
{
public:
    virtual void start() = 0;
    virtual void stop() = 0;
};


длл
Код

class my_driver_t : public driver_t
{
public:
    void start()
    {
    }

    void stop()
    {
    }
};

extern "C"
driver_t *create_driver()
{
    return new my_driver_t;
}

extern "C"
void destroy_driver(driver_t *driver)
{
    delete driver;
}


приложение 
Код

int main()
{
    //Загружаем длл и вызываем функция create_driver
    //работаем с драйвером
    //вызываем destroy_driver
}



Это сообщение отредактировал(а) chaos - 17.6.2009, 06:32
PM WWW   Вверх
Artemon
Дата 17.6.2009, 07:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


а ты мне нравишься
***


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

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



chaos, у меня практически такойже код, но вот только проблема в том, что о ноткомпилирован под VS2005, а DLL вызываю из C++Builder, думаю в этом проблема. Вот и хотелось бы узнать, как можно вызывать методы из такой DLL.


--------------------
Контроль топлива на топливозаправщиках, мониторинг автотранспорта, расчет зарплаты водителей www.rscat.ru
PM MAIL   Вверх
chaos
Дата 17.6.2009, 07:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Серийный программист
****


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

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



Цитата(Artemon @ 17.6.2009,  04:19)
chaos, у меня практически такойже код, но вот только проблема в том, что о ноткомпилирован под VS2005, а DLL вызываю из C++Builder, думаю в этом проблема. Вот и хотелось бы узнать, как можно вызывать методы из такой DLL.

тут еще имеет значение что методы длл принимают в качестве параметров
например если метод принимает CString то что передавать из кода написаного на билдере я не знаю smile
приведи примеры методов, те их декларации
PM WWW   Вверх
Artemon
Дата 17.6.2009, 10:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


а ты мне нравишься
***


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

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



Код

//-----------------------------------------------
class CAbstractCompressor
{
public:
    CAbstractCompressor(void);
    virtual ~CAbstractCompressor(void);

    /// Add data to Pack
    virtual void AddData(BYTE* Data, int DataSize, char Label[30]) = 0;

    /// Write file size and Save it
    virtual void Flush(void) = 0;

    virtual void SetFLASH_ID(char* Id) = 0;
    virtual void GetFLASH_ID(char* Id) = 0;
};
//-----------------------------------------------


Использование:
Код

//-------------------------------------------------------------
extern "C" PACKERWIN32DLL_API void GetCompressor(char* BufFileName, CAbstractCompressor*& Compressor)
{
    Compressor = new CCompressor(BufFileName);
}
//-------------------------------------------------------------




Это сообщение отредактировал(а) Artemon - 17.6.2009, 10:40


--------------------
Контроль топлива на топливозаправщиках, мониторинг автотранспорта, расчет зарплаты водителей www.rscat.ru
PM MAIL   Вверх
azesmcar
Дата 17.6.2009, 10:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

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



Цитата(chaos @  17.6.2009,  06:31 Найти цитируемый пост)
в чем собственно проблема?

Alexeis описал проблему. Обьект возвращать можно, в случае если обе программы пишутся на том же компиляторами, компилируются теми же опциями. И еще много "ЕСЛИ".

Проблемных примеров тысяча.
что вам известно о vtable? В стандарте об этом ничего не сказано...следовательно размеры обьектов могут различаться? Могут!
Разные выравнивания структур могут быть? Могут! Об этом тоже стандарт молчит. Как насчет overhead -а при выделениях памяти?
Продолжать можно долго. Вообщем нежелательно этим заниматся.

Добавлено через 1 минуту и 53 секунды
Цитата(Artemon @  17.6.2009,  05:52 Найти цитируемый пост)
Тогда как можно поступить в этом случае ? 

писать программу и DLL на одном и том же компиляторе smile 
PM   Вверх
Artemon
Дата 17.6.2009, 11:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


а ты мне нравишься
***


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

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



Цитата

писать программу и DLL на одном и том же компиляторе



Да, это выход, но чтобы к примеру на VS2005 + MFC написать сложный интерфейс - нужно убить кучу времени.

Ладно пойду другим методом:

Заведу глобальную переменную класса внутри DLL
И буду ее дергать только через экспортируемые ф-ии DLL.


--------------------
Контроль топлива на топливозаправщиках, мониторинг автотранспорта, расчет зарплаты водителей www.rscat.ru
PM MAIL   Вверх
azesmcar
Дата 17.6.2009, 11:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

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



Цитата(Artemon @  17.6.2009,  11:02 Найти цитируемый пост)
Да, это выход, но чтобы к примеру на VS2005 + MFC написать сложный интерфейс - нужно убить кучу времени.

ну так напишите Длл на билдере, в чем проблема?

Цитата(Artemon @  17.6.2009,  11:02 Найти цитируемый пост)
Заведу глобальную переменную класса внутри DLL
И буду ее дергать только через экспортируемые ф-ии DLL. 

а что это изменит?
PM   Вверх
mrbrooks
Дата 17.6.2009, 11:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

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



Цитата(Artemon @  17.6.2009,  11:02 Найти цитируемый пост)
Да, это выход, но чтобы к примеру на VS2005 + MFC написать сложный интерфейс - нужно убить кучу времени.

как на счет прикрутить WinForm или QT  smile 

Кстати - в свое время я прикручивал библу, но статически.

Добавлено через 4 минуты
При условии что есть *.lib исходной библиотеки. используем тузлу coff2omf.exe (вместе с Билдером постовляется) - из консоли 
coff2omf vs.lib vs.tmp
и затем меняем vs.tmp на vs.lib и соединяем с проектом в Билдере.

Мало ли - вдруг поможет.
PM MAIL   Вверх
Alexeis
Дата 17.6.2009, 11:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



Цитата(azesmcar @  17.6.2009,  09:49 Найти цитируемый пост)
писать программу и DLL на одном и том же компиляторе

    Даже если версия компилятора совпадает, это не гарантия что всегда будет работать. Гарантия правильной работы будет только в случае если класс экспортируется. Может будет, может нет. Нельзя программировать надеясь на "может".


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Artemon
Дата 17.6.2009, 11:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


а ты мне нравишься
***


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

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



Цитата

ну так напишите Длл на билдере, в чем проблема?


Да дело в том, что после Win32 нужно будет по быстрому перевести эту DLL в WinCE, вот поэтому и пишу DLL на VS2005.

Цитата

а что это изменит?


Это все в корне меняет, я не вызываю напрямую вирутальные методы объекта, вместо этого я вызываю экспортируемые ф-ии DLL.

Цитата

как на счет прикрутить WinForm или QT   


Нет желания разбираться, побыстрее сделать и забыть.

Цитата

Даже если версия компилятора совпадает, это не гарантия что всегда будет работать. Гарантия правильной работы будет только в случае если класс экспортируется. Может будет, может нет. Нельзя программировать надеясь на "может".


У меня ни разу не было чтобы с одинаковым компилятором и вылез какой-то глюк.



--------------------
Контроль топлива на топливозаправщиках, мониторинг автотранспорта, расчет зарплаты водителей www.rscat.ru
PM MAIL   Вверх
Alexeis
Дата 17.6.2009, 12:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



Цитата(Artemon @  17.6.2009,  10:54 Найти цитируемый пост)
У меня ни разу не было чтобы с одинаковым компилятором и вылез какой-то глюк.

  Это не гарантия smile . Производитель компилятора не гарантирует что это будет работать. Если речь идет о билдере с его VCL компонентами, то там на 100% работать не будет несмотря на то что версия компилятора совпадает, даже если объединить менеждеры куч. Это проверенно не одним "камикадзе"


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
xvr
Дата 17.6.2009, 13:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Используйте COM модель. Состыкуется (и на CE переведется)

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

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

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

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

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


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

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


 




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


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

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