Форум: "Основная";
Текущий архив: 2004.12.05;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.042 c