منع تنفيذ البرنامج عدة مرات

السلام عليكم و رحمة الله وبركاته.

الكثير من الاخوة يسألون عن كيفية منع المستخدم من تنفيذ عدة نسخ من البرنامج في نفس الوقت, علما ان الاجابة ليست بتلك الصعوبة التي يتخيلها الكثيرون.. لن تحتاج الى التعامل مع الكيرنل او ان تطير مع العصافير سوف تحتاج فقط الى ان تجد نقطة مشتركة بين النسخ وتجعلها غير قابلة لمشاركة. جميل

  • mutex

احد المبادئ في انظمة التشغيل المتعددة المسارات. حيث يستعمل في اقصاء اي عملية تريد الدخول الى المجال المحمي او ما يعرف ب

critical section — section critique

function OneInstanceMutex:Boolean;
begin
    Hnd := OpenMutex(MUTEX_ALL_ACCESS, false, 'OneInstance');
    Result := (Hnd <> 0);

    if Hnd = 0 then
        Hnd := CreateMutex(nil, false, 'OneInstance');
end;
  • file

يمكن ايضا ان تعتمد مثلا على الملفات و اخطاء انشائها او القراءة منها او الكتابة فيها

جرب مثلا ان تستعمل هذا الكود و هو يقوم بانشاء ملف مؤقت ممنوع من المشاركة مع البرامج الاخرى

function CreateOnlyFile:Boolean;
var
    FileStrct :TOFStruct;
    hFile     :THandle;
    FileName  :String ;
begin
    FileName := 'tmp.tmp';
    hFile :=  CreateFile(
         PAnsiChar(FileName),
         GENERIC_READ or GENERIC_WRITE,
         FILE_SHARE_READ ,
         0,
         CREATE_ALWAYS ,
         FILE_ATTRIBUTE_TEMPORARY or  FILE_FLAG_DELETE_ON_CLOSE,
     0);
    if hFile = INVALID_HANDLE_VALUE then
        Result := True
    else
        Result := False;
end;

او ربما يكون لديك ملف يحتوي على اعدادات البرنامج يمكن ان تستعمله و تفتحه على انه ممنوع على الاخرين

جرب الكود التالي

function OpenFileOnly:Boolean;
var
    FileStrct: TOFSTRUCT;
begin
    if OpenFile('tmp.tmp',FileStrct,OF_SHARE_DENY_READ)= HFILE_ERROR then
        Result := True
    else
        Result:= False;
end;

هناك بالتأكيد عدة طرق اخرى لكنني اكتفي بذكر هذه الثلاثة فقط

لا تنس ان هذا الكود مرتبط بالوحدة الاساسية التي يتم فيها انشاء الصنف

  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.Run;

فقط قم بمناداة احدى الاجراءات قبل تلك الاسطر
لا تنس ايضا ان تعرف في بداية البرنامج

var
  Hnd: THandle;

Posted on 2010/02/02, in Delphi and tagged . Bookmark the permalink. أضف تعليق.

أضف تعليق