![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
DLL entryPoint
snake1977 © (2004-11-18 19:20:00)Здравствуйте! подскажите что не так?? я сделал обработку загрузки и выгрузки 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);
Мастер (2004-11-18 21:02:00) [1]А вообще посмотри вот на такой код:
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.
Мастер (2004-11-18 20:59:00) [2]Отладь без DLL вот это -
AssignFile(f,'out.txt');
{$I+}
reset(f);
{$I+}
if IOResult<>0 then Rewrite(f);
writeln(f,'-----');
closeFile(f);
snake1977 (2004-11-18 20:07:00) [3]в проекте глобальная перменная
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;
panov (2004-11-18 19:50:00) [4]Сразу же в глаза бросается -
Procedure StartAtt;
Begin
Timer:=MyTimer.Create( True);
timer.FreeOnTerminate:= False;
End;
Далее,
- нет определения класса TTimer,
- нет полного кода DLL(откуда берется переменная Timer, например),
- нет кода подключения библиотеки, кода вызова функций.