Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Доступ из DLL


Автор: _Dimon_ 27.3.2009, 20:23
Как получить доступ из ДЛЛ к обектам которые находятся на форме приложения, которое вызвало эту ДЛЛ (динамически)?

Автор: Gradov 27.3.2009, 23:28
_Dimon_, 
Передай в экспортируемую функцию в качестве параметра указатель на объект, находящийся на форме приложения. И вызови данную функцию.

Добавлено через 7 минут и 30 секунд
Только формулировка "доступ из ДЛЛ" наверное будет корректна только в том случае если dll многопотоковая. В противном случае вызов функции из dll будет в принципе таким же как и любой функции самого приложения.

Автор: _Dimon_ 28.3.2009, 05:01
Можно пример, а то с dll работал, но "обратною связь" никогда не использовал

длл не многопоточная, она вызывается как форма для построения отчета

Автор: Klin 28.3.2009, 06:00
Буквально вчера днем давал совет по этому поводу. Так как это стандартная операция, то в ней даже ничего интересного нет. На форуме обсуждалось это многократно. Поэтому даю ключевые слова для поиска: dll, GetProcAddress, GetModuleHandle, LoadLibrary, DllEntryPoint.

_Dimon_, я часто говорю сарказмы и т.п., но это абсолютно серьезный совет - купите компьютерную литературу, или используйте интернет для ее поиска. На нашем форуме есть раздел компьютерной литературы, где вы сможете найти для себя много полезной информации. Я не говорю, что не стоит использовать этот раздел форума, если вы напишите свой вопрос, вам конечно на него ответят. Но мне кажется, что хотя бы основы лучше изучить, а если что-то будет не понятно, или возникнет какая-то проблема - то здесь вам помогут.

ps. буквально внизу страницы есть "А здесь смотрели?". Где есть пример: http://forum.vingrad.ru/topic-150119.html

Автор: _Dimon_ 28.3.2009, 19:26
Klin, не стоит так реагировать, эту  тему (Вставить форму в DLL, не показывая ее и не вызывая) я смотрел но не понял сути.
Давайте задам вопрос по-другому: Как из ДЛЛ изменить, например, Caption формы приложения?


Извините, может я сначала вопрос неправильно сформулировал

Автор: 586 28.3.2009, 20:03
Может, поможет: http://forum.vingrad.ru/index.php?showtopic=180438&view=findpost&p=1309115

Автор: Gradov 28.3.2009, 20:18
_Dimon_
Создай новый проект <Dynamic Library> c флажком <Use VCL>, назови test_dll, добавь туда след. код и сделай Build. Должен быть создан файл test_dll.dll. Если файл не создан, то пиши - проверим где ошибка.
Код

//Функция в исходнике DLL
extern "C" __stdcall __declspec(dllexport) void ChangeFormCaption(TForm *form)
{

    form->Caption="Изменено!";
}


Далее создай простое приложение и кнопку на форме. Добавь след. код:
Код

//Приложение вызывающее DLL
.....
typedef void (*MYPROC)(TForm *);
.....
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    HINSTANCE hinstLib;
    MYPROC ProcAdd;
.....
  hinstLib = LoadLibrary("test_dll");
  ProcAdd = (MYPROC) GetProcAddress(hinstLib, "ChangeFormCaption");
  if (ProcAdd!=NULL) ProcAdd(Form1);
  FreeLibrary(hinstLib);
}


Все должно работать. Если нет - пиши, заставим работать.  smile 


Автор: _Dimon_ 28.3.2009, 20:29
586, Gradov, спасибо, это именно то что я искал smile 

Автор: Klin 28.3.2009, 20:43
_Dimon_, иногда я бываю резок, но я лишь хотел посоветовать, как лучше всего подойти к изучению языка.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)