Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Создание формы в потоке, функция которого находится в DLL [D7]


_Андрей ©   (2005-08-09 19:15:00) 

Здравствуйте!
Необходимо создать форму(окно) в потоке, функция которого находится в DLL.
Описание формы находится в библиотеке DLL. Функция потока также находится в этой DLL. Сам поток запускается из основного потока. Проблема в том, что возникает ошибка при попытке создать форму. Приведу пример кода.
Модуль описания формы, функции потока и код DLL:

 ...
 type
   TMyForm = class(TForm)
     ...
   end;
 ...
 function ThreadFunc(lpParams: pointer):DWORD;
 var MyForm: TMyForm;
 begin
  ...
  try
    MyForm := TMyForm.Create(Application);
  except
    ...
  end;
  ...
 end;
 ...
 var DLLApp: TApplication;
 ...
 function GetThreadFunction(AppObj: integer):pointer;
 begin
   if not Assigned(DLLApp) then DLLApp:=TApplication(AppObj);
   Result:=@ThreadFunc;
 end;
 ...
 exports
   GetThreadFunction;
 ...

Создание потока из основного потока:

 ...
 type
   TGetThreadFunction(AppObj: integer):pointer;
 ...
 var
   hThread: THandle;
   lpGetThreadFunction: TGetThreadFunction;
   lpFunc  : pointer;
 ...
 @lpGetThreadFunction:=GetProcAddres(hDLL,'GetThreadFunction');
 lpFunc:=lpGetThreadFunction(integer(Application));
 hThread:=BeginThread(..
                      lpFunc,
                      ..);
 ...

Сам поток создается и начинает своё выполнение в функции GetThreadFunction, которая описана в DLL, но вот объект формы TMyForm не создается - возникает исключение.
Может кто знает как все-таки создать форму в потоке, код которого должен выполняться в DLL?
Заранее спасибо!


DiamondShark   (2005-08-09 20:34:00) [1]

Я присоединяюсь к предыдущему оратору,
А от себя хочу спросить: с какой целью понадобился субж?

Может исходную задачу мы поможем решить менее трансректальным способом?


sniknik   (2005-08-09 20:05:00) [2]

VCL не "Thread Safe" компоненты, т.что формы в потоках надо создавать на "чистом" API/заменах типа Kol(хотя тут я не в курсе, может он аналогичен VCL-ю, надо в их форуме уточнить...)
а с VCL-лем, как ни извращайся, глюки/риск глюков все одно останется.


_Андрей   (2005-08-09 19:21:00) [3]

и еще одна ошибочка:

...
function GetThreadFunction(AppObj: integer):pointer;
begin
  if not Assigned(DLLApp)
  then begin
    DLLApp:=Application;
    Application:=TApplication(AppObj);
  end;
  Result:=@ThreadFunc;
end;
...


_Андрей   (2005-08-09 19:19:00) [4]

Немного ошибся в описании:

 ...
 type
  TGetThreadFunction=function(AppObj: integer):pointer;
 ...

и, естественно, поток после вызова функции BeginThread начинает работать не GetThreadFunction(), а в функции потока ThreadFunc, описанной в DLL.


Наверх

Титульная страница Поиск, карта сайта Написать письмо