PDA

View Full Version : پاک کردن یک پردازش از حافظه



Cheetah
شنبه 10 دی 1384, 16:02 عصر
سلام! به همه دوستان برنامه نویس:بامزه:
چطور میشه یک برنامه در حال اجرا رو از حافظه پاک کرد؟
در واقع می خوام کاری شبیه به همان کار Task manager رو انجام بدم.
اصلا میشه این کار رو با سی شارپ انجام داد یا اینکه باید حتما با زبانی مثل ++C انجام بشه.
ممنون میشم اگه کمکم کنید.:چشمک:

Mehdi Asgari
شنبه 10 دی 1384, 23:10 عصر
مثال زیر ، Yahoo Messenger رو می بنده.


Process[] ps = Process.GetProcesses();
foreach(Process p in ps)
{
if(p.ProcessName.ToLower() == "ypager")
{
p.Kill();
}

}

فقط یادت باشه از using System.Diagnostics; استفاده کنی.

Cheetah
جمعه 16 دی 1384, 00:54 صبح
خیلی ازت ممنونم.
حتما امتحانش می‌کنم!
اگه دوستان دیگه هم اطلاعاتی داشتن خوشحال میشیم استفاده کنیم!!!

shahab_ss
شنبه 24 دی 1384, 14:08 عصر
حالا اگه من بخام یک Application رو بجای یک Process کنترل کنم چجوری میشه ؟!!!

Mehdi Asgari
شنبه 24 دی 1384, 21:59 عصر
خب اول اون Application رو اجرا کن. (Process.Start ) ، بعد به عنوان یه پروسس کنترلش کن

shahab_ss
شنبه 24 دی 1384, 22:30 عصر
خب باید بگم من میخام یه برنامه برای نگهداشتن Connection Account ها بنویسم اما مشکل اینجاست که DialUp Connection ها توی لیست Process ها نیستن. حالا پیشنهاد شما چیه ؟؟؟

Mehdi Asgari
یک شنبه 25 دی 1384, 22:17 عصر
سلام
من یه sample از برنامه درخواستیت رو به زبان VB 6 پیدا کردم .
حالا خودت زحمت ترجمه اش به سی شارپ رو بکش.:متفکر:

shahab_ss
دوشنبه 26 دی 1384, 08:40 صبح
دستت درد نکنه مهدی جون. این کد خیلی به درد میخوره. اما من میخام لیست connect هائی که از هر Dial Up Connection انجام شده رو LOG کنم .

Cheetah
دوشنبه 26 دی 1384, 11:07 صبح
این از Process ها !
و حالا یه سوال در ادامه بحث!!!
برای کنترل Service ها چیکار باید کرد ؟
فکر می کنم Dial Up Connection هم یه Service باشه

shahab_ss
دوشنبه 26 دی 1384, 21:48 عصر
سرویس که نیست ولی منو سرویس کرده !!!
یه سورس دارم که هروقت رفتم پای سیستم خودم آپلودش میکنم.

Mehdi Asgari
دوشنبه 26 دی 1384, 21:58 عصر
دستت درد نکنه مهدی جون. این کد خیلی به درد میخوره. اما من میخام لیست connect هائی که از هر Dial Up Connection انجام شده رو LOG کنم
یه خورده که با سیستم ور رفتم به اطلاعات زیر رسیدم:
متوجه شدم که با هر بار کانکت شدن به اینترنت، ویندوز یک EventLog Information از نوع RemoteAccess ایجاد می کنه با این مضمون :

The user {UID} successfully established a connection to Kavosh using the device COM3.

خب ما این اطلاعات رو داریم:
تاریخ و ساعت اتصال به اینترنت ( به عکسی که ضمیمه کردم نگاه بنداز)
نام کاربری (username) مربوط به connection (که من اون رو برداشته و به جاش {UID} قرار دادم.)
نام Connection که در نمونه بالا ، Kavosh هست.
و پورتی که مودم روی اون وصل شده: مودم من روی COM3 نصب شده.

با disconnect شدن هم یه EventLog دیگه ایجاد میشه با همون نام منتها با این تفاوت که EventID مربوط به اتصال به اینترنت ، 20158 هست ، منتها EventID این ، 20159 هست.

The connection to Kavosh made by user {UID} using device COM3 was disconnected.
اینجا هم همون اطلاعات در دسترسمون هست.

من یه برنامه نوشتم و ضمیمه کردم. این برنامه دو تا ListBox داره ، ListBox بالایی همواره در حال انتظاره و داره گوش میکنه ، به محض اینکه به اینترنت وصل (یا از اون قطع) شدی ، اطلاعات مربوطه
رو نشون میده.
با فشار button ، ListBox پایینی حاوی اطلاعات تمامی وصل و قطع شدن های اینترنت از 3 روز قبل تا این لحظه است.
(حالا خودت میتونی بنابه نیازت ، برنامه رو تغییر بدی تا بر روی فایل بنویسه)

نکات:
1 – این برنامه از سرویس Eventlog استفاده می کنه؛ پس برای اجرای درست این برنامه باید این سرویس بر روی سیستم در حال اجرا باشه. (در تمامی ویندوز ها این سرویس در حال اجراست ، مگر اینکه کاربر خودش اون رو stop کرده باشه)
2- برای مشاهدۀ EventLog ها »
Control Panel  Administrative Tools  Event Viewer
3- به نظر من باید یه Windows Service بنویسی تا همواره اطلاعات مربوطه رو برات log کنه.

4- فکر می کنم توسط WMI هم بتونی این اطلاعات رو به دست بیاری.
5- احتمالا API ها و یا راه های دیگه ای هم برای این کار وجود داشته باشه.
6- من فقط راه رو نشون دادم ، یه خورده که ور بری با WMI و EventLogs و Google و MSDN
، خودت کلی اطلاعات برای گسترده کردن کار این برنامه و دریافت اطلاعات بیشتر (حتی دریافت رمز عبور اینترنت ) پیدا می کنی.
(یه کمک : از برنامۀ evntwin.exe استفاده کن .)


برای کنترل Service ها چیکار باید کرد ؟

دقیقا نمیدونم ولی احتمالا کلاس ServiceController در System.ServiceProcess کارتو راه بندازه.
(برای استفاده از این کلاس باید System.ServiceProcess.dll رو Add Reference کنی.)

shahab_ss
سه شنبه 27 دی 1384, 08:10 صبح
اینم سورس که گفته بودم !!!!

shahab_ss
سه شنبه 27 دی 1384, 08:31 صبح
دستت درد نکنه اووووس مهدی !!!
خیلی زحمت کشیدی و لطف کردی رفیق.
من هم یه چیز هائی پیدا کردم که دارم روش کار میکنم . ردیف که شد آپلود میکنم همینجا

shahab_ss
سه شنبه 11 بهمن 1384, 14:14 عصر
مهدی جون بازم سلام !!!
آقا من یه windows service نوشتم که هیچ error نداره اما کار هم نمیکنه !!!!
خواستم توش از کد شما استفاده کنم که event ها رو log کنه اما هیچی دریافت نمیکنه .
میشه یه تست کنی ببینی شما جواب میگیری یا نه ؟!!

مرسی

Mehdi Asgari
سه شنبه 11 بهمن 1384, 22:38 عصر
سلام
من یه دمو فقط برای تست کارکرد برنامه نوشتم ، درست و کامل کار کرد.
فقط تا جمعه صبر کن تا آخرین امتحانم رو هم بدم ، بعد برنامۀ کامل همراه با توضیح
رو میذارم همینجا.

shahab_ss
سه شنبه 11 بهمن 1384, 22:58 عصر
تا جمعه که چیزی نیست تا شنبه هم صبر میکنم اوووس مهدی !!!
قوووربوون تو

Mehdi Asgari
جمعه 14 بهمن 1384, 23:24 عصر
سلام
امروز آخرین امتحانم دادیم و خلاص . :لبخند:
این برنامه ای رو که ضمیمه کردم دانلود کرده و Build کنید.
نکات:
1 – در متد OnStart ، سازنده شی اصلی رو فراخوانی کردم. (کار این متد مثل متد Main میمونه
و وقتی فراخوانی میشه که کاربر سرویس ما رو Start میکنه)
2 – در متد OnStop هم این شی رو Close (یا در اصل Dispose ) کردم. (این متد هم هنگام Stop کردن
سرویسمون فراخوانی میشه)
3 – Windows Service مثل برنامه اجرایی معمولی نیست که با دابل کلیک کردن روی فایلش
(یا با Ctrl-F5 از منوی VS ) بشه اون رو اجرا کرد ، بلکه نیاز به یه installer داره. برای ایجاد خودکار یه
Installer ، روی فایل Service1.cs (این اسم پیش فرضه) در Solution Explorer کلیک راست کنید ،
گزینۀ Add Installer رو بزنید. حالا پروژه رو Build کنید.

آخرین قدم برای افزودن سرویستون به لیست سرویس های سیستم ، اینه که فایل اجراییتون رو به عنوان
آرگومان به برنامۀ installutil.exe (که همراه با VS در SDK ، نصب میشه) ، به فرم زیر بدین:

installutil [FileName]
مثال:

C:\Projects\WindowsService1\bin\Debug> installutil WindowsService1.exe
(این برنامه در خود Windows وجود نداره ، یعنی از cmd قابل اجرا نیست ، بلکه باید اون رو از طریق
Visual Studio .NET Command Prompt اجرا کنید)
حالا سرویس ما نصب شده و شروع به کار کرده.
برای دیدن اسم سرویس (که در این مثال ، MehdiSvc هست) ، به اینجا برین:

Control Panel – Administrative Tools – Services
به دنبال نام MehdiSvc بگردین ، حالا میتونین Start و Stop کنین و ...
(پس فهمیدیم که نام فایل و نام سرویس ، لزوما یکی نیستن و مستقل از یکدیگرن)

4 – این برنامه ، رویدادها رو در فایل Mehdilog.txt در %System32% ، log میکنه)
در مورد Windows Service میشه به اندازۀ یه کتاب صحبت کرد
برای تکمیل بحث و اطلاعات اضافی ، توصیه میکنم اگه MSDN 2003 رو دارین ، مقاله
Create Windows Services نوشته Billy Hollis رو بخونین.

(یادم رفت بگم ، برای uninstall کردن سرویس ، اول اون رو Stop کنید ، بعد با سویچ
u/ در installutil ، اون رو uninstall کنین.)

shahab_ss
شنبه 15 بهمن 1384, 19:36 عصر
مهدی جون سلام
دستت درد نکنه زحمت کشیدی دوباره.
برنامه ای که شما زحمتشو کشیدی نوشتی درست شبیه برنامه خودم بود. همونطوری که گفتم هیچ خطائی نداره اما event ها رو دریافت نمیکنه !!!
شما روی سیستم خودت از این برنامه جواب گرفتی ؟؟؟
آخه روی سیستم من کار نمیکنه. من فایل Mehdilog.txt رو بعد از اجرای برنامه ندارم.البته بصورت دستی هم این فایل رو ساختم ولی بعد از connect شدن هیچ مقداری در اون نوشته نمیشه !!
به نظر میرسه که windows service ما این event رو اصلا دریافت نمیکنه .من حتی با یه MessageBox هم تست کردم ولی تابع نوشتن فایل و تشخیص event اصلا اجرا نمیشه !!
اما همین کد توی windowsForm Application داره به خوبی کار میکنه !!!

Mehdi Asgari
شنبه 15 بهمن 1384, 22:56 عصر
من از این برنامه جواب گرفتم.
(فایل log در پوشه System32 واقع در پوشه نصب ویندوز ، ایجاد میشه)
مثل:
C:\Windows\System32\Mehdilog.txt