نمایش نتایج 1 تا 9 از 9

نام تاپیک: خارج کردن یک برنامه اجرایی از حافظه

  1. #1
    کاربر دائمی آواتار Mahdavi
    تاریخ عضویت
    فروردین 1382
    محل زندگی
    ایران - میگن تهرون
    پست
    606

    خارج کردن یک برنامه اجرایی از حافظه

    با سلام
    برنامه دارم که میخوام در صورت اجرای اون اگه قبلا نسخه ای از اون اجرا شده نسخه قبلی خارج بشه.
    بعبارت دیگه هندل مربوط به فایل اجراییمو از کجا پیدا کنم ؟؟؟

  2. #2
    1-این قبلاٌ چندین بار گفته شده است و به روشهای دیگر
    2-با findwindow می توانی پیدا کنی

  3. #3
    کاربر دائمی آواتار Mahdavi
    تاریخ عضویت
    فروردین 1382
    محل زندگی
    ایران - میگن تهرون
    پست
    606
    دوست عزیز
    اگه توجه کرده باشید findwindow یک هندل میخواد نام اون پنجره.
    منم دنبال بدست اوردن این هندلم چراکه نه تنها با findwindow بلکه با چند روش دیگه هم میشه برنامه اجرایی را از حافظه خارج کرد.
    حتی مثالی هم برای excel دارم ولی برای برنامه خودم میخوام :lol:

  4. #4
    کاربر دائمی آواتار SReza1
    تاریخ عضویت
    تیر 1382
    محل زندگی
    کنار تعدادی تراریوم و کاکتوس!
    پست
    702
    دوست عزیز یه جستجوی ساده میتونی این topic رو پیدا کنی!!
    از طریق findwindow میشه!! و کلی توضیح هم داده شده!

  5. #5
    کاربر دائمی
    تاریخ عضویت
    مرداد 1382
    محل زندگی
    تهران
    پست
    484
    استفاده از FindWindow روش صحیحی نیست چون احتمال اینکه دو تا برنامه مختلف دارای پنجره هم نام باشند زیاد هست. بجای استفاده از عنوان پنجره بهتره از نام فایل اجرایی استفاده کنیم که احتمال مشابه بودنش با یک برنامه دیگه کمتره.
    uses
    TLHelp32;

    function FindExecutableProcessID(const ExeFileName: String): DWORD;
    var
    Snapshot: THandle;
    ProcessEntry32: TPROCESSENTRY32;
    begin
    Result := 0;
    Snapshot := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    try
    if Snapshot <> 0 then
    begin
    ProcessEntry32.dwSize := SizeOf(TPROCESSENTRY32);
    if Process32First(Snapshot, ProcessEntry32) then
    repeat
    if StrIComp(PChar(ExeFileName), ProcessEntry32.szExeFile) = 0 then
    Result := ProcessEntry32.th32ProcessID;
    until (Result <> 0) or not Process32Next(Snapshot, ProcessEntry32);
    end;
    finally
    CloseHandle(Snapshot);
    end;
    end;

    function TerminateProcessID(ProcessID: DWORD; ExitCode: DWORD): Boolean;
    var
    ProcessHandle: THandle;
    begin
    Result := False;
    ProcessHandle := OpenProcess(PROCESS_TERMINATE, False, ProcessID);
    if ProcessHandle <> 0 then
    try
    Result := TerminateProcess(ProcessHandle, ExitCode);
    finally
    CloseHandle(ProcessHandle);
    end;
    end;

    type
    TTerminateAppRes = (tarSucceeded, tarNotRunning, tarFailed);

    function TerminateApp(const ExeFileName: String; ExitCode: DWORD): TTerminateAppRes;
    var
    ProcessID: DWORD;
    begin
    ProcessID := FindExecutableProcessID(ExeFileName);
    if ProcessID <> 0 then
    if TerminateProcessID(ProcessID, ExitCode) then
    Result := tarSucceeded
    else
    Result := tarFailed
    else
    Result := tarNotRunning;
    end;

    به عنوان نمونه اجرای کد زیر باعث می‌شه که یک نسخه از برنامه NotePad در حال اجرا بسته بشه:
    procedure TForm1.Button1Click(Sender: TObject);
    begin
    case TerminateApp('notepad.exe', 0) of
    tarSucceeded:
    ShowMessage('The application terminated succesfully');
    tarNotRunning:
    ShowMessage('The application is not running');
    else
    ShowMessage('Failed to terminate the application');
    end;
    end;

    اگر بخوایم تمام نسخه‌های NotePad رو ببندیم کد بالا رو باید اینجوری بنویسیم:
    procedure TForm1.Button2Click(Sender: TObject);
    begin
    while TerminateApp('notepad.exe', 0) = tarSucceeded do
    Sleep(0);
    end;

  6. #6
    کاربر دائمی آواتار Mahdavi
    تاریخ عضویت
    فروردین 1382
    محل زندگی
    ایران - میگن تهرون
    پست
    606
    با سلام
    ممنون از راهنمایی تمام دوستان

  7. #7
    استفاده از FindWindow روش صحیحی نیست چون احتمال اینکه دو تا برنامه مختلف دارای پنجره هم نام باشند زیاد هست. بجای استفاده از عنوان پنجره بهتره از نام فایل اجرایی استفاده کنیم که احتمال مشابه بودنش با یک برنامه دیگه کمتره.
    من تصور میکنم احتمال وجود دو یا چند برنامه با نام پنجره یکسان با احتمال وجود دو یا چند برنامه با نام فایل اجرائی یکسان قابل مقایسه اند . لذا بهتر است از روشهای دیگر استفاده شود :


    هنگام شروع هر برنامه یک موتکس با نام انحصاری ایجاد کنید . هنگام اجرای نسخه دوم برنامه ، برنامه قبل از اجرا چک میکند که آیا موتکسی با نام انحصاری خاص شما ( که اینجا دیگه تکراری بودنش تقریبا غیر ممکنه ) وجود داره یا خیر . اگر تابع ویندوزی CreateMutex نتوانست یک موتکس بسازد یعنی برنامه شما قبلا اجرا شده است .

    program Project1;

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

    {$R *.res}
    var
    Mutex : THandle;
    begin
    Mutex := CreateMutex(nil, True, 'My_Unique_Application_Mutex_Name');
    if (Mutex = 0) OR (GetLastError = ERROR_ALREADY_EXISTS) then
    begin

    // کدهای لازم برای پیدا کردن نسخه قبلی و بستن آنرا اینجا بنویسید

    end
    else
    begin
    Application.Initialize;
    Application.CreateForm(TForm1, Form1);
    Application.Run;
    if Mutex <> 0 then
    CloseHandle(Mutex);
    end;
    end;
    end.



    پیدا کردن نسخه قبلی با این شرط که "میدانیم نسخه قبلی وجود دارد" : ( این عبارت و روش با " پیدا کردن نسخه قبلی" خیلی فرق داره !! )


    این به نظر من بهترین کد است :


    function LookForPreviousInstance
    (Handle : THandle; Param : Cardinal): boolean; stdcall;
    var
    buf : array[0..255] of char;
    WindowModuleName : string;
    WindowClassName : string;
    wih : THandle; //هندل پنجره
    begin
    Result := True;

    GetClassName(Handle, buf, SizeOf(buf));
    WindowClassName := buf;

    //بررسی برابری نام پنجره ها
    if WindowClassName = TForm1.ClassName then
    begin
    wih := GetWindowLong(Handle, GWL_HINSTANCE),

    GetModuleFileName(wih, buf, SizeOf(buf));
    WindowModuleName := buf;

    //بررسی برابری نام برنامه های تولید کننده پنجره های فوق الذکر
    if WindowModuleName = ThisModuleName then
    begin
    FoundIt := True;
    FoundHandle := Handle;

    Result := False;
    end;
    end;
    end;



    موفق باشید

  8. #8
    BUG : گویا تو قسمت محصور به تک Code نمیشه فارسی نوشت :roll:
    UNIX is simple. It just takes a genius to understand its simplicity
    -- Dennis Ritchie

  9. #9
    کاربر دائمی آواتار Mahdavi
    تاریخ عضویت
    فروردین 1382
    محل زندگی
    ایران - میگن تهرون
    پست
    606
    با سلام و تشکر از همه دوستان
    مشکل من حل شد :lol:

تاپیک های مشابه

  1. تقاضایی راهنمایی و کمک در کار با Dreamweaver
    نوشته شده توسط احمد کاوه در بخش طراحی وب (Web Design)
    پاسخ: 4
    آخرین پست: پنج شنبه 29 مهر 1389, 12:41 عصر
  2. آقا چه چیزایی با javascript قابل حل هست چه چیزایی با .net
    نوشته شده توسط odiseh در بخش ASP.NET Web Forms
    پاسخ: 13
    آخرین پست: جمعه 02 فروردین 1387, 04:44 صبح
  3. دوستانی که با interbase آشنایی دارند لطفا راهنمایی کنند
    نوشته شده توسط mehdi_moosavi در بخش بانک های اطلاعاتی در Delphi
    پاسخ: 4
    آخرین پست: شنبه 01 بهمن 1384, 14:11 عصر

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •