PDA

View Full Version : سوال: اجرای برنامه البته بعد از بسته شدن برنامه



loo30fer
شنبه 11 تیر 1390, 22:02 عصر
با سلام
من میخواستم قبل از بسته شدن برنامه دستور اجرا شدن برنامم رو بدم و برنامه رو ببندم ولی چون برنامه رو تک اجرا میکنم یعنی اگه اجرا بود بیشتر از یکبار اجرا نشه سریع میخواد برنامه رو اجرا کنه و ببنده ولی کلا من میخوام بدونم میشه تابعی نوشت و از ویندوز درخواست کرد که مثلا بعد از 2 ثانیه برنامه من رو اجرا کن و بعدش دستور خروج برنامه رو بدم تا مجددا اجرا بشه درست میخوام مثل دانلود منیجر عمل کنم که وقتی تغییر زبان میدی بسته میشه و مجددا اجرا میشه حتی وقتی برنامه کمکیش IEMonitor رو میبندیم. ممنون میشم راهنمایی کنید با تشکر

Felony
شنبه 11 تیر 1390, 22:44 عصر
میتونید تو شرطی که Single بودن Mutex رو بررسی میکنه ، چک کنید اگر مثلا پارامتر Reset به برنامه ارسال شد برنامه رو مجدد اجرا کنید و Single بودن Mutex رو در نظر نگیرید ؛ Mutex تون به صورت زیر در میاد ( تو فایل dpr پروژه ) :

var
Mutex: THandle;

begin
Mutex := CreateMutex(nil, True, 'Mojtaba');
if (Mutex <> 0) and (GetLastError = 0) or (ParamStr(1)= 'Reset') then
begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
CloseHandle(Mutex);
end;

و برای ریست کردن برنامه به صورت زیر عمل میکنیم :

ShellExecute(Handle, 'Open', PWideChar(Application.ExeName), 'Reset', '', SW_NORMAL);
Application.Terminate;

loo30fer
شنبه 11 تیر 1390, 22:47 عصر
ممنون جناب تاجیک ولی من میخوام تو بیلدر اینکار رو بکنم البته تو پلاگین پیادش کنم میشه اینکار رو کرد؟

Felony
شنبه 11 تیر 1390, 23:08 عصر
خیر ؛ راه بالا رو نمیشه تو پلاگین به اون صورتی که مد نظرتون هست پیاده کرد ؛ برای پلاگین چیزی که الان به ذهنم میرسه ساخت یک فایل اجرایی واسط مخفی هست ، فایل واسط باید مسئول اجرای مجدد برنامه باشه ، فایل واسط رو به صورت ریسورس در پلاگین ذخیره میکنید و بعد توسط پلاگین اون رو داخل یک MemoryStream میریزید و مستقیما از روی حافظه اجراش میکنید ( یا روی دیسک ذخیرش میکنید و بعد اجراش میکنید ) ، با اجرای فایل واسط به صورت مخفی برنامه اول بسته میشه و بعد از n ثانیه برنامه واسط دوباره فایل اولیه رو اجرا میکنه و خودش بسته میشه .

loo30fer
شنبه 11 تیر 1390, 23:20 عصر
ممنون جناب تاجیک حالا اگه بعد از اینکه اون فایل رو برای اجرای مجدد برنامه اجرا کردم و بعد بخوام برنامه رو از طریق پلاگین ببندم بهترین روش بستن از Terminate کردن برنامه هست یا ارسال دستور Exit بیلدر با تابع اگه اشتباه نکنم SendMassage ؟

Felony
شنبه 11 تیر 1390, 23:58 عصر
هندل پنجره برنامه اجرایی ( بیلدر ) رو که دارید ، میتونید با ارسال پیغام WM_Close اون رو ببندید .