Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.034 c
14-1099837490
ИМХО
2004-11-07 17:24
2004.12.05
Слово о TEX


3-1099778094
Mih@s
2004-11-07 00:54
2004.12.05
IBDataSet и Params


3-1099815997
klerk
2004-11-07 11:26
2004.12.05
Update БД


9-1091703136
pavel_pavel
2004-08-05 14:52
2004.12.05
TBitmap побыстрее


14-1100801242
Quath
2004-11-18 21:07
2004.12.05
Мастерам словесного поноса!!! Читать обязательно!!!





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский