Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.11.2011, 10:37   #1
kenji
Пользователь
 
Регистрация: 28.10.2010
Сообщений: 22
По умолчанию Создание потока в dll

Не получается запустить поток в длл. Именно при LogThread:= TLogThread.Create(false); длл выдаёт ошибку.
Поток нужен для мониторинга некоторого события, поэтому код должен быть зациклен.
Если не делать потока, то всё работает, но вызывающая прога просто зависает (ну так и должно быть).
Может я упустил какой-то принцип создания потока именно в длл? Когда этот код был в ехе, то всё работало как надо.
Код:
library logmonitor;

uses
  Windows,
  Messages,
  SysUtils,
  Variants,
  Classes,
  Graphics,
  Controls,
  Forms,
  Dialogs,
  XPMan,
  Grids,
  StdCtrls,
  ActiveX,
  ExtCtrls,
  mmsystem,
  Filter;

const
  SID_IAccessible = '{618736E0-3C3D-11CF-810C-00AA00389B71}';
  IID_IAccessible: TGUID = SID_IAccessible;
  NAVDIR_FIRSTCHILD = 7;
  NAVDIR_NEXT = 5;
  NewLogMax = 10;

type
  IAccessible = interface(IDispatch)
    [SID_IAccessible]
    function Get_accParent(out ppdispParent: IDispatch): HRESULT; stdcall;
    function Get_accChildCount(out pcountChildren: Integer): HRESULT; stdcall;
    .....
      const pszValue: WideString): HRESULT; stdcall;
  end;

function AccessibleObjectFromWindow(hwnd: THandle; dwId: DWORD;
  const riid: TGUID; out ppvObject): HRESULT; stdcall; external 'oleacc.dll';

type
  TLogThread = class(TThread)
    private
      NewLog     :byte;
      Acc          :IAccessible;
      Res          :HRESULT;
      AccChild    :OleVariant;
      iTime        :WideString;
      iMsg         :WideString;
    protected
      procedure Execute; override;
    end;

var
  LogThread      :TLogThread;
  LastTime       :WideString;
  PreLastTime    :WideString;
  LastMsg        :WideString;
  PreLastMsg     :WideString;
  first          :boolean;
  Journal        :HWND;
  NewLog         :byte;

{$R *.res}

// ñëóæåáíîå -----
function EnumChildProc(hWnd: HWND; lParam: LPARAM): BOOL; stdcall;
var
  CName:       array[0..Pred(MAX_PATH)] of Char;
  CNLen:       Integer;
begin
 //кое что делает
end;

// ñëóæåáíîå --- ñèíõðîíèçàöèÿ ïîòîêà
procedure TLogThread.Execute;
begin
Journal:= 0;
NewLog := 0;
first:= true;

while not Terminated do
   begin
   
   try
   // что-то делает
   except
   ShowMessage('Error');
   end;

   Application.ProcessMessages;
   Sleep(50); 
   end;
end;

// ñòàðò àíàëèçà
function StartMonitor(hndl: integer): integer; stdcall; export;
begin
if hndl <= 0 then ShowMessage('Íåâåðíûé äåñêðèïòîð')
else
   begin
   EnumChildWindows(HWND(hndl), @EnumChildProc, LPARAM(@Journal));
   if Journal = 0 then ShowMessage('Îêíî æóðíàëà íå íàéäåíî')
   else
   try
   if (LogThread.Terminated = true) then
         begin
         LogThread:= TLogThread.Create(false);
         LogThread.Priority:= tpNormal;
         LogThread.FreeOnTerminate:= true;
         end;
   except
      ShowMessage('Error of thread'); // при запуске выходит это сообщение
   end;
   end;
result := GetLastError;
end;

// ñòîï àíàëèçà
function StopMonitor(): integer; stdcall;
begin
if (LogThread.Terminated = false) then LogThread.Terminate;
result := GetLastError;
end;

exports StartMonitor, StopMonitor;

begin
CoInitialize(nil);
end.
kenji вне форума Ответить с цитированием
Старый 04.11.2011, 11:48   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

ошибка то какая?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 04.11.2011, 12:18   #3
kenji
Пользователь
 
Регистрация: 28.10.2010
Сообщений: 22
По умолчанию

Пока не могу посмотреть. Переношу поток в отдельный юнит.

Последний раз редактировалось mihali4; 04.11.2011 в 14:49.
kenji вне форума Ответить с цитированием
Старый 04.11.2011, 13:13   #4
kenji
Пользователь
 
Регистрация: 28.10.2010
Сообщений: 22
По умолчанию

Всё заработало. Надо было перенести код потока в отдельный юнит.

Осталось разобраться с остановкой потока, а то при вызове завершения вызывающая прога вылетает
kenji вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создание потока и отличие cargo29 Общие вопросы Delphi 7 29.07.2011 18:19
bass.dll Скорость мать его потока... Дворник Мультимедиа в Delphi 5 24.08.2010 09:37
Создание потока GoldP Win Api 0 14.05.2010 21:28
Создание потока Хохол Общие вопросы .NET 0 21.11.2009 16:44
Создание события потока Arteom Общие вопросы Delphi 9 11.01.2008 21:16