Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.12.05;
Скачать: CL | DM;

Вниз

DLL entryPoint   Найти похожие ветки 

 
snake1977   (2004-11-18 19:20) [0]

Здравствуйте! подскажите что не так?? я сделал обработку загрузки и выгрузки DLL

Procedure StartAtt;
Begin
Timer:=MyTimer.Create(False);
timer.FreeOnTerminate:=True;
End;

Procedure StopAtt;
Begin
Timer.Terminate;
Timer.WaitFor;
End;

procedure DLLEntryPoint(Reason: DWORD);
begin
case Reason of
Dll_Process_Attach: StartAtt;
Dll_Thread_Attach: StartAtt;
Dll_Thread_Detach: StopAtt;
Dll_Process_Detach: StopAtt;
end;
end;

begin
if DllProc = nil then
 begin
  DllProc := @DLLEntryPoint;
  DllEntryPoint(Dll_Process_Attach);
 end;
end.

где Timer это наследник от TThread
т.е. при загрузке DLL
я запускаю поток а при выгрузке останавливаю
в потоке стоит просто открыть файл записать туда строку и закрыть файл

программа вылетает с Access violation уже при создании потока.
почему???
Timer:=MyTimer.Create(False);


 
panov ©   (2004-11-18 19:50) [1]

Сразу же в глаза бросается -

Procedure StartAtt;
Begin
 Timer:=MyTimer.Create(True);
 timer.FreeOnTerminate:=False;
End;


Далее,
- нет определения класса TTimer,
- нет полного кода DLL(откуда  берется переменная Timer, например),
- нет кода подключения библиотеки, кода вызова функций.


 
snake1977   (2004-11-18 20:07) [2]

в проекте глобальная перменная
Lib:HWND;
и две кнопки
на одной
Lib:=LoadLibrary(PChar("att.dll"));
на второй
FreeLibrary(Lib);

В DLL
Определение класса

Type
    MyTimer=Class(TThread)
      Procedure DoWork;
      Procedure Execute;
    end;

Procedure MyTimer.DoWork;
Var f:TextFile;
Begin
AssignFile(f,"out.txt");
{$I+}
reset(f);
{$I+}
if IOResult<>0 then Rewrite(f);
writeln(f,"-----");
closeFile(f);
End;

Procedure MyTimer.Execute;
Begin
While not Terminated do
 Begin
  DoWork;
  Sleep(60000);
 End;
End;


 
Мастер ©   (2004-11-18 20:59) [3]

Отладь без DLL вот это -

AssignFile(f,"out.txt");
{$I+}
reset(f);
{$I+}
if IOResult<>0 then Rewrite(f);
writeln(f,"-----");
closeFile(f);


 
Мастер ©   (2004-11-18 21:02) [4]

А вообще посмотри вот на такой код:

library VerySimpleTimer;

uses
 SysUtils,
 Classes;

type
 TVerySimpleTimer=class(TThread)
 private
   FTimeout: Cardinal;
   procedure Timer;
 protected
   procedure Execute;override;
 public
   constructor Create(const Timeout: Cardinal);
   procedure Stop;
   procedure Start;
 end;

{ TVerySimpleTimer }

constructor TVerySimpleTimer.Create(const Timeout: Cardinal);
begin
 inherited Create(True);
 FTimeout := Timeout;
 FreeOnTerminate := False;
end;

procedure TVerySimpleTimer.Execute;
begin
 while not Terminated do
 begin
   Timer;
   Sleep(FTimeOut);
 end;
end;

procedure TVerySimpleTimer.Start;
begin
 Resume;
end;

procedure TVerySimpleTimer.Stop;
begin
 Suspend;
end;

procedure TVerySimpleTimer.Timer;
var
 f:TextFile;
Begin
 AssignFile(f,"d:\out.txt");
 if FileExists("d:\out.txt")
   then Append(f)
   else Rewrite(f);
 writeln(f,"-----");
 closeFile(f);
end;

function CreateAtt(const Timeout: Cardinal): Integer;
begin
 Result := Integer(TVerySimpleTimer.Create(Timeout));
end;

procedure EndAtt(MyTimer: Integer);
var
 Timer: TVerySimpleTimer;
begin
 Timer := Pointer(MyTimer);
 Timer.Terminate;
 Timer.WaitFor;
 Timer.Free;
end;

procedure StopAtt(MyTimer: Integer);
var
 Timer: TVerySimpleTimer;
begin
 Timer := Pointer(MyTimer);
 Timer.Stop;
end;

procedure StartAtt(MyTimer: Integer);
var
 Timer: TVerySimpleTimer;
begin
 Timer := Pointer(MyTimer);
 Timer.Start;
end;

exports
 CreateAtt,
 EndAtt,
 StartAtt,
 StopAtt;
end.


Вызов:

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls;

type
 TForm1 = class(TForm)
   Button1: TButton;
   Button2: TButton;
   procedure Button1Click(Sender: TObject);
   procedure Button2Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;
 Timer: Integer;

function CreateAtt(const Timeout: Cardinal): Integer; external "VerySimpleTimer.dll";
procedure StartAtt(MyTimer: Integer); external "VerySimpleTimer.dll";
procedure StopAtt(MyTimer: Integer); external "VerySimpleTimer.dll";
procedure EndAtt(MyTimer: Integer); external "VerySimpleTimer.dll";

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
 Timer := CreateAtt(1000);
 StartAtt(Timer);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
 EndAtt(Timer);
end;

end.



Страницы: 1 вся ветка

Текущий архив: 2004.12.05;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.023 c
1-1100673760
MikePol
2004-11-17 09:42
2004.12.05
AddXY и TChart


14-1100520707
syte_ser78
2004-11-15 15:11
2004.12.05
Как я провел выходные


1-1100825047
dolphin
2004-11-19 03:44
2004.12.05
stringgrid


1-1101207056
markers
2004-11-23 13:50
2004.12.05
Алтернативный прогрессбар, с градиентом...


14-1100382291
Fin
2004-11-14 00:44
2004.12.05
Создание серьезных игр.