PDA

View Full Version : مقاله: اجرای برنامه فقط یک بار در هر بار اجرای ویندوز !



Mahmood_M
چهارشنبه 19 اسفند 1388, 06:24 صبح
با سلام ...
داشتم به مطالب قبلي وبلاگم نگاهي مي انداختم كه اين مقاله رو ديدم كه چون موضوع جالبي بود گفتم در سايت قرار بدم ...
خیلی مواقع نیاز پیدا می کنیم که یک برنامه رو محدود کنیم ، یا تعداد دفعات اجرای برنامه رو محدود کنیم یا ...
در این مقاله ی کوتاه قصد داریم روشی رو بررسی کنیم که در اون برنامه ی ما در هر بار اجرای ویندوز فقط یک بار اجرا بشه و برای اجرای دوباره نیاز به اجرای مجدد ( Restart ) ویندوز باشه !
یعنی فرض کنید کاربر وارد ویندوز شد و برنامه ی شما رو اجرا کرد ، حالا برای اجرای دوباره ی برنامه حتما باید کامپیوتر رو Restart کنه و ویندوز رو دوباره بالا بیاره ... !
این روش می تونه برای محدود کردن اجرای برخي برنامه ها مناسب باشه ...

اما روش کار :
در ویندوز یک جدول سیستمی ( System-Defined Table ) وجود داره که هر برنامه ی ویندوزی می تونه در اون یک مقدار String رو قرار بده ، برنامه ای که یک مقدار String رو در این جدول ثبت میکنه از طرف ویندوز یک مقدار Integer به عنوان آدرس رشته ی ثبت شده در جدول دریافت میکنه و به وسیله ی اون عدد می تونه به مقدار ثبت شده دسترسی داشته باشه ، این جدول به Atom Table معروف هست ، این جدول همونطور که گفته شد یک مقدار String رو در خودش نگه می داره ، اما ویژگی ای که داره و ما از اون استفاده خواهیم کرد اینه که با شروع دوباره ( Restart ) ویندوز اطلاعات این جدول هم پاک می شن و مقدار های ذخیره شده در اون دیگه در دسترس نیستند ...
خوب ، امیدوارم روش کار رو حدس زده باشید ، ما باید با شروع برنامه یک مقدار String رو در این Table ثبت کنیم و با هر بار شروع برنامه چک کنیم که آیا این مقدار String در Table مذکور هست یا نه ، اگر وجود داشت ، پس برنامه قبلا اجرا شده و دیگه نباید اجرا بشه و اینجاست که باید برنامه رو ببندیم !

خوب ، در دلفی و در یونیت Windows توابعی برای کار با این Table وجود دارند ، که در زیر لیست اونها رو مشاهده می کنید :

GlobalAddAtom : این تابع یک مقدار رشته ( String یا PAnsiChar ) را گرفته و در جدول مذکور ثبت کرده و یک مقدار عددی به عنوان آدرس رشته ی ثبت شده بر می گرداند.
GlobalFindAtom : این تابع یک مقدار رشته را گرفته و آن را در Table ویندوز جستجو می کند ، اگر مقدار را پیدا کرد ، مقدار عددی مربوط به آدرس آن را به عنوان خروجی بر می گرداند ولی اگر رشته را در جدول پیدا نکرد ، مقدار 0 را به عنوان خروجی بر خواهد گرداند !
GlobalDeleteAtom : این تابع مقدار عددی مربوط به آدرس رشته ی درون جدول را گرفته و آن را از جدول حذف می کند

خوب ، کار سختی در پیش نداریم ...
باید یونیت اصلی پروژه رو کمی دستکاری کنیم ، یونیت اصلی پروژه را باز کرده و یک متغیر از نوع THandle به عنوان مقدار عددی مربوط به آدرس رشته و یک ثابت با مقدار مثلا " THE-APP-HAVE-RUNED " در آن ثبت کنید ...
باید بعد از دستور Application.Initialize ، ابتدا مقدار رشته را در جدول ویندوز جستجو کنیم و اگر مقدار پیدا نشد یعنی خروجی تابع GlobalFindAtom برابر صفر بود ، برنامه رو اجرا كنيم ، در غیر این صورت مثلا پیغامی به کاربر نمایش مي ديم و همينطور ازاجراي برنامه جلوگيري مي كنيم ...
به کد زیر دقت کنید :
program Atom_Table;

uses
Forms, Windows,
Unit1 in 'Unit1.pas' {Form1};

{$R *.res}

var
MyAppAtom : THandle;

const
MyAppString = 'THE-APP-EXECUTED';

begin
Application.Initialize;
MyAppAtom := GlobalFindAtom(MyAppString);
if MyAppAtom = 0 then
begin
MyAppAtom := GlobalAddAtom(MyAppString);
Application.CreateForm(TForm1, Form1);
Application.Run;
end
else
MessageBox(Application.Handle, 'You have runed the Application 1 time'+#13+
'Please Restart Windows to Run the Application again !', '', MB_OK+MB_ICONINFORMATION);
end.
کد بالا سورس یونیت اصلی پروژه ای به نام Atom_Table است که تنها یک فرم دارد با نام Fom1 ..
اول از همه متذکر بشم که یونیت Windows رو باید به قسمت Uses اضافه كنيد ...
در کد بالا ما یک متغیر و یک ثابت تعریف کردیم که وظایفشون در بالا ذکر شد ! ، بعد از لود شدن برنامه ( Application.Initialize ) مقدار رشته رو در جدول ویندوز جستجو کردیم ، و مقدار اون رو در MyAppAtom قرار دادیم ، با یک دستور if چک کردیم که آیا مقدارش 0 هست یا نه ، اگر صفر بود برنامه ابتدا به وسیله ی تابع GlobalAddAtom رشته ی مورد نظر رو در جدولي كه ذكر شد ثبت مي كنه و بعد برنامه اجرا می شه ، اگر هم که مقدار برگشتی تابع GlobalFindAtom برابر صفر نبود ، یعنی برنامه قبلا اجرا شده که در این صورت پیغامی به کاربر نمایش داده می شه و برنامه اجرا نخواهد شد ...
نکته ی آخر اینکه همونطور که ذکر شد با تابع GlobalDeleteAtom می تونید مقدار رشته ی ثبت شده رو حذف کنید ...

سورس مربوط به اين مقاله رو هم مي تونيد از لينك زير دريافت كنيد :


لينك زير ! (http://parsaspace.com/files/1648228884/atom_table.rar.html)
اميدوارم مفيد بوده باشه ...

موفق باشيد ...