C++Builder
  Начало   Форум   Помощь Войти Регистрация  
Страниц: [1]   Вниз
  Печать  
Автор Тема: Передача информации в DLL  (Прочитано 2775 раз)
lepricon
Участник


Сказали спасибо: +0/-0
Offline

Сообщений: 29


Передача информации в DLL
« : 03 Февраль 2009, 13:41:09 »

Всем доброго времени суток!
Каким образом можно передать в DLL указатель на класс окна? Хочу, чтобы в многооконном (MDI) приложении каждое дочернее окно могло вызывать процедуры из DLL, передавая в качестве входного параметра указатель на самого себя. Если, например, процедура расположена в обычном модуле (не DLL), то все работает хорошо. Если в DLL, то при попытке подключить библиотеку, вываливаются ошибки о том, что тот или иной класс уже инициализирован. Например в окне есть компонент TChart, пишет, что TChartTitle уже есть и т.д.
Записан
oxotnik
Глобальный модератор


Сказали спасибо: +100/-15
Offline

Сообщений: 2425


Re: Передача информации в DLL
« Ответ #1 : 03 Февраль 2009, 15:54:48 »

в модуле dll пишем:
Код
#include "MyFormUnit.h"
 
extern "C" __declspec(dllexport) void MuFunc (TMyForm *MyForm);
 
.....
void MuFunc (TMyForm *MyForm)
{
// работаем с формой (указатель MyForm)
 
}
 
в основном приложении в модуле дочернего окна
Код
typedef void (*MYFUNC)(TMyForm *MyForm);
 
void __fastcall TMyForm::Button1Click  (TObject *Sender)
{
  HINSTANCE hDBDll = LoadLibrary("mydll.dll");
  MYFUNC MyFunc = NULL;
  if (!hDBDll) return;
  MyFunc = (MYFUNC)GetProcAddress(hDBDll, "_MyFunc");
  if (MyFunc) MyFunc(this);
  FreeLibrary(hDBDll);
}
 
Записан
lepricon
Участник


Сказали спасибо: +0/-0
Offline

Сообщений: 29


Re: Передача информации в DLL
« Ответ #2 : 03 Февраль 2009, 21:52:10 »

Так и делал, один в один.

Убрал TChart из окна - все заработало. Вернее не совсем все, но библиотека загрузилась нормально. С ним - не грузится. Выводит сообщение о существовании класса и все... Но без графиков хреново, нужны они...
Есть какие-то особенности работы с Tchart таким образом, через dll?
Записан
Zor
Глобальный модератор


Сказали спасибо: +158/-30
Offline

Сообщений: 2946


Re: Передача информации в DLL
« Ответ #3 : 03 Февраль 2009, 21:57:15 »

oxotnik развиваем телепатические способности по дист. считыванию чужого кода?
фиг знает что он там наворотил.
Записан
lepricon
Участник


Сказали спасибо: +0/-0
Offline

Сообщений: 29


Re: Передача информации в DLL
« Ответ #4 : 03 Февраль 2009, 22:20:18 »

Да код тут ни причем. Есть пустое MDI окно. Вызываю DLL также как написал oxotnik. В экспортируемой процедуре библиотеки 1 строчка: ShowMessage("This is DLL"). Все в порядке.
Помещаю на окно компонент TChart. До вызова процедуры дело не доходит. Вываливается на LoadLibrary с ошибкой о сущеcтвовании класса TChartAxisTitle.
Записан
lepricon
Участник


Сказали спасибо: +0/-0
Offline

Сообщений: 29


Re: Передача информации в DLL
« Ответ #5 : 03 Февраль 2009, 22:40:40 »

Сорри, немножко неточно написал. Ошибка "A class named TChartAxisTitle alredy exists" вываливается как только в экспортируемой процедуре идет обращение к TChart. Т.е. в таком варианте

Код
extern "C" void __export RunProc(TMDIChild* W)
{
ShowMessage("This is DLL");
// W->Series2->Clear();
}

все нормально, а в таком

Код
extern "C" void __export RunProc(TMDIChild* W)
{
// ShowMessage("This is DLL");
W->Series2->Clear();
}

вываливается ошибка. Причем именно на LoadLibrary, а не на непосредственном вызове функции....
Записан
Zor
Глобальный модератор


Сказали спасибо: +158/-30
Offline

Сообщений: 2946


Re: Передача информации в DLL
« Ответ #6 : 03 Февраль 2009, 22:51:04 »

весьма информативно
Записан
oxotnik
Глобальный модератор


Сказали спасибо: +100/-15
Offline

Сообщений: 2425


Re: Передача информации в DLL
« Ответ #7 : 04 Февраль 2009, 10:47:15 »

нормально все работает
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  




....

Powered by SMF 1.1.21 | SMF © 2025, Simple Machines
Страница сгенерирована за 0.142 секунд. Запросов: 20.