PDA

View Full Version : ايجاد يك تايمر در DLL



دنیای دلفی
سه شنبه 04 تیر 1387, 17:13 عصر
مگر با اين روش يك تايمر را به صورت ران تايم ايجاد نمي كنند . من مي خواهم در يك DLL اين كار را انجام بدهم .



procedure OnTimerRepairData(Sender:TObject);
begin
Try


Except

end;

end;



var
Repair:TTimer;


Repair := TTimer.Create(nil);
Repair.Interval:=1000;
Repair.Enabled:=True;
Repair.OnTimer:=OnTimerRepairData;
با خطا مواجه مي شوم .
براي ايجاد اين تايمر در dLL بايد به چه روشي عمل كرد .

اين هم خطايي است كه كامپايلر مي دهد
[Error] Special.dpr(106): Incompatible types: 'method pointer and regular procedure'
ممنون از راهنمايي

vcldeveloper
سه شنبه 04 تیر 1387, 17:29 عصر
اين هم خطايي است كه كامپايلر مي دهد
متدی که به یک رویداد نسبت میدید، باید متعلق به یک کلاس باشه، یعنی در داخل یک کلاس تعریف شده باشه. procedureایی که شما اونجا نوشتید، یک Global Procedure هست و متعلق به هیچ کلاسی نیست.

دنیای دلفی
سه شنبه 04 تیر 1387, 17:37 عصر
مي دونم چي مي گيد . مثلا كلاس TForm1 ولي حالا با اين وضعيت چگونه بدون معرفي كلاس اين كار را انجام بدهم.
يا كلا توي DLL همچين كاري امكان پذير است .

ممنون كه راهنمايي كرديد

vcldeveloper
چهارشنبه 05 تیر 1387, 04:15 صبح
چگونه بدون معرفي كلاس اين كار را انجام بدهم.
باید یک کلاس تعریف کنید. البته اگر هدف فقط رسیدن به کارکرد Timer هست، می تونید بجای استفاده از کامپوننت مربوطه، خودتون با استفاده از توابع API ویندوز یک تایمر بسازید و ازش استفاده کنید.


كلا توي DLL همچين كاري امكان پذير است .
منظور چه کاری هست؟
- تعریف کلاس؟ بله.
- ایجاد یک نمونه از کلاس در زمان اجرا؟ بله، با تعریف یک DLLProc جدید برای DLL و ایجاد شی در DLL_PROCESS_ATTACH و آزاد کردن آن در DLL_PROCESS_DETACH.

دنیای دلفی
چهارشنبه 05 تیر 1387, 19:15 عصر
آقاي كشاور كاشكي اگر وقت مي كردي يك مثال براي تعريف كلاسش مي گذاشتي

vcldeveloper
چهارشنبه 05 تیر 1387, 19:47 عصر
كاشكي اگر وقت مي كردي يك مثال براي تعريف كلاسش مي گذاشتيدر یک یونیت مجزا کلاس را تعریف می کنید:


uses
ExtCtrls;
type
TMyClass = class
private
FTimer : TTimer;
protected
procedure MyTimerEventHandler(Sender: TObject);
public
constructor Create;
destructor Destroy; override;
end;

implementation

procedure MyTimerEventHandler(Sender: TObject);
begin

end;

constructor Create;
begin
inherited;
FTimer := TTimer.Create(nil);
FTimer.Interval := 1000;
FTimer.OnTimer := MyTimerEventHandler;
FTimer.Enabled := True;
end;

destructor Destroy; override;
begin
FTimer.Enabled := False;
FTimer.Free;
inherited;
end;
در کد DLL یونیت مربوطه را use می کنید و کدی شبیه به این می نویسید:


var
MyObj : TMyClass

procedure EntryPoint(Event: DWord);
begin
case Event of
DLL_PROCESS_ATTACH : begin
MyObj := TMyClass.Create;
end;
DLL_PROCESS_DETACH : begin
FreeAndNil(MyObj);
end;
DLL_THREAD_ATTACH : ;
DLL_THREAD_DETACH : ;
end;
end;


begin
Dllproc := @EntryPoint;
EntryPoint(DLL_PROCESS_ATTACH);
end.

دنیای دلفی
چهارشنبه 05 تیر 1387, 19:48 عصر
آقاي كشاوز تا اينجا رسوندمش لطفا درستش كنيد :




library Special;

uses
Windows,ExtCtrls;

type
TSpecial = class(TTimer)


private
{ Private declarations }

public
{ Public declarations }
procedure RunTimers;
procedure OnTimerRepairData(Sender:TObject);

end;


{$R *.res}





procedure DatabaseConnect; stdcall;
begin

end;


procedure TSpecial.OnTimerRepairData(Sender:TObject);
begin
Try


Except

end;
end;

procedure TSpecial.RunTimers;
var
Repair:TTimer;
begin
Repair := TTimer.Create(nil);
Repair.Interval:=1000;
Repair.Enabled:=True;
Repair.OnTimer:=OnTimerRepairData;
end;

procedure DLLEntryPoint(dwReason: DWORD); stdcall; //register;

begin
case dwReason of
// DLL_THREAD_DETACH : ShowMessage('Thread Detach'); //0
DLL_PROCESS_ATTACH: //1
begin



end;
// DLL_THREAD_ATTACH : ShowMessage('Thread Attach'); //2
// DLL_PROCESS_DETACH: //3
// begin
//
// ShowMessage('Close');
// end;
end;
end;


exports
DatabaseConnect;

begin
//DLLEntryPoint is specifically a Win32 and C++ implementation
//DLLProc is a pointer variable from the SYSTEM Unit (automatically included)
//The SYSTEM Unit is responsible for executing code assinged to DLLEntryPoint
DLLProc := @DLLEntryPoint; //Assign the address of DLLEntryPoint to DLLProc
DLLEntryPoint(DLL_PROCESS_ATTACH); //Indicate that the DLL is attaching to the process
RunTimers;

end.

دنیای دلفی
چهارشنبه 05 تیر 1387, 19:52 عصر
ببخشيد پستتون رو نديدم

ممنون از راهنمايي

دنیای دلفی
پنج شنبه 06 تیر 1387, 01:15 صبح
آقاي كشاورز بررسي شد ولي خطاهاي زيادي را مي ده خيلي روش كار كردم .
خودتون تستش كرديد

vcldeveloper
پنج شنبه 06 تیر 1387, 04:08 صبح
ولي خطاهاي زيادي را مي ده خيلي روش كار كردم . مثلا چه خطاهایی؟ یکسری خطاهای معمولی ممکن هست وجود داشته باشه، چون من کد را خارج از دلفی نوشتم، مثلا: ExtCtrls به بخش uses اضافه نشده، یا بجای خصوصیت Enabled برای Timer، نوشتم Active، یا احتمالا یکسری اشکالات املائی.
اگر خطایی غیر از موارد فوق دریافت می کنید، کدی که برای DLL نوشتید، و کدی که برای فراخوانی DLL نوشتید، و متن خطاهایی که دریافت می کنید را اینجا بزارید.

دنیای دلفی
شنبه 08 تیر 1387, 15:09 عصر
دست شما درد نكنه درست شد .

ممنون از همكاري و وقت گذاشتن