PDA

View Full Version : آموزش: خارج نمودن برنامه از حافظه به صورت كامل...



butterfly8528
چهارشنبه 26 مرداد 1390, 23:19 عصر
سلام دوستان و اساتيد عزيز .
يكي از دوستان سوالي مبني بر خارج نشدن برنامشون از حافظه بعد از بستن برنامه پرسيده بودند،بنده قبلا بارها اين سوال از رو از سوي ديگر كاربران هم ديده بودم و به كرات شاهد اين مشكل در برنامه هاي مختلفي كه دوستان نوشته بودند بودم . از اين جهت ترجيح دادم اين موضوع مهم رو به صورت آموزش قرار بدم كه به اميد خدا راه حلي باشه براي تمام دوستاني كه با اين مشكل مواجه هستند .
'www.arshamsoft.com

Option Explicit

Private Declare Function GetCurrentProcess Lib "kernel32" () As Long
Private Declare Function GetExitCodeProcess Lib "kernel32" (ByVal hProcess As Long, lpExitCode As Long) As Long
Private Declare Sub ExitProcess Lib "kernel32" (ByVal uExitCode As Long)


Private Sub Form_Unload(Cancel As Integer)
ExitProcess GetExitCodeProcess(GetCurrentProcess, 0)
End Sub

براي اين كار از سه تابع GetExitCodeProcess ، GetCurrentProcess و ExitProcess استفاده مي كنيم .
GetCurrentProcess : براي بدست آوردن Handle (دستگيره) فرايند برنامه .
GetExitCodeProcess : براي بدست آوردن كد خاتمه فرايند مشخص شده .
ExitProcess : براي بستن و خارج نمودن فرايند و تمام Tread ( بند ) هاي آن از حافظه .

با اين روش برنامه به صورت كامل از حافظه خارج مي شود .

اميدوارم مفيد واقع بشه ، موفق و پيروز باشيد :لبخندساده:.

farboodj1375
پنج شنبه 27 مرداد 1390, 14:42 عصر
ممنون.
ولی وقتی من دارم رو سورس برنامم کار میکنم و از این کد هم تو برنامم استفادهع میکنم بعد ز بسته شدن برنامه ویبی 6 هم بسته میشه؟
البته من از یک ساعت آنالوگ هم تو برنامم استفاده کردم شاید از اون باشه...:گریه:

setroyd
پنج شنبه 27 مرداد 1390, 15:28 عصر
نه این سورس کارش خاتمه دادن به کل پروسسهای موجودی هست که با برنامه بازه اگه شما در محیط کد نویسی این کارو کنی بله vb6 هم بسته میشه شما سعی کن برنامت رو کامل بنویسی بعد از اتمام برنامه این رو کپی کن تو unload فرمت و compile کن برنامتو

butterfly8528
پنج شنبه 27 مرداد 1390, 16:19 عصر
سلام دوست عزیز.

ممنون.
ولی وقتی من دارم رو سورس برنامم کار میکنم و از این کد هم تو برنامم استفادهع میکنم بعد ز بسته شدن برنامه ویبی 6 هم بسته میشه؟
برای رفع این مشکل،میتونید قبل از بستن فرایند،چک کنید که برنامه از داخل IDE اجرا شده یا نه :
Private Function IsEXE() As Boolean

Static bEXE As Boolean

If Not bEXE Then
bEXE = True
Debug.Assert IsEXE() Or True
IsEXE = bEXE
End If

bEXE = False

End Function


Private Sub Form_Unload(Cancel As Integer)
If IsEXE = True Then ExitProcess GetExitCodeProcess(GetCurrentProcess, 0)
End Sub

موفق باشید :لبخندساده:.

IamOverlord
پنج شنبه 27 مرداد 1390, 16:46 عصر
سلام دوست عزیز،
می تونید یه توضیح مختصری در مورد طرز کار کد بالا بدید؟

farboodj1375
پنج شنبه 27 مرداد 1390, 17:53 عصر
متشکر.
فقط یه چیزی:
من نمیدونم کلا برنامه ای که دارم مینویسم چه اشکالی داره که خیلی اذیت میکرد و میکنه(حتی قبل استفاده از روش های شما)
مثلا 2 بار که از تو سورس برنامه رو اجرا میکنم یکدفعه پیغام میاد از طرف ویندوز (همون پیغام که مایکروسافت معذرت خواهی میکنه و گزینهی Dont Send داره) بعدشم ویبی بسته میشه.
خیلی حالمو گرفته.

و فکر میکنم همه اینها زیر سر اون ساعت آنالوگی هست که استفاده میکنم.
البته ساعته سورس هست و کامپوننت نیست.

اگه بتونین کمکم کنین واقعا لطف بزرگی میکنین.
ممنون.

farboodj1375
پنج شنبه 27 مرداد 1390, 17:55 عصر
البته نمیتونم سورس برنامه رو برای اصلاح بذارم چون حجمش از 80 مگابایت بیشتره که با زیپ کردن هم میشه حدود 40 مگ که بازم خیلی هست.
منتظرم.

محسن واژدی
پنج شنبه 27 مرداد 1390, 18:01 عصر
سلام دوست عزیز.

برای رفع این مشکل،میتونید قبل از بستن فرایند،چک کنید که برنامه از داخل IDE اجرا شده یا نه :
Private Function IsEXE() As Boolean

Static bEXE As Boolean

If Not bEXE Then
bEXE = True
Debug.Assert IsEXE() Or True
IsEXE = bEXE
End If

bEXE = False

End Function


Private Sub Form_Unload(Cancel As Integer)
If IsEXE = True Then ExitProcess GetExitCodeProcess(GetCurrentProcess, 0)
End Sub

موفق باشید :لبخندساده:.
سلام علیکم
راه ساده تر نیز استفاده از دستور زیر است که نیاز به نوشتن روال اضافی نیست:


Private Sub Form_Unload(Cancel As Integer)
If App.LogMode=1 Then ExitProcess GetExitCodeProcess(GetCurrentProcess, 0)
End Sub

در دستور بالا اگر برنامه هنوز کامپایل نشده باشد مقدار برگشتی LogMode برابر صفر و در برنامه کامپایل شده برابر 1 است

موفق باشید

محسن واژدی
پنج شنبه 27 مرداد 1390, 18:09 عصر
متشکر.
فقط یه چیزی:
من نمیدونم کلا برنامه ای که دارم مینویسم چه اشکالی داره که خیلی اذیت میکرد و میکنه(حتی قبل استفاده از روش های شما)
مثلا 2 بار که از تو سورس برنامه رو اجرا میکنم یکدفعه پیغام میاد از طرف ویندوز (همون پیغام که مایکروسافت معذرت خواهی میکنه و گزینهی Dont Send داره) بعدشم ویبی بسته میشه.
خیلی حالمو گرفته.

و فکر میکنم همه اینها زیر سر اون ساعت آنالوگی هست که استفاده میکنم.
البته ساعته سورس هست و کامپوننت نیست.

اگه بتونین کمکم کنین واقعا لطف بزرگی میکنین.
ممنون.

سلام علیکم
برای پیدا کردن ریشه خطا، وقتی که پیام crash ظاهر شده به بخش شرح خطا برین و نام کامپوننتی که این خطا در آن رخ داده است را پیدا کنین سپس در برنامه بدنبال apiهایی که از این کامپوننت استفاده کرده اند بگردید که با بررسی آنها انشاء الله به ریشه خطا میرسید
اگر میتوانستید سورس را ضمیمه کنید خیلی بهتر میشد به جواب رسید اما گویا حجم زیادی دارد

موفق باشید

محسن واژدی
پنج شنبه 27 مرداد 1390, 18:19 عصر
سلام دوست عزیز،
می تونید یه توضیح مختصری در مورد طرز کار کد بالا بدید؟

سلام علیکم
از آنجایی که Debug فقط در زمان طراحی اجرا میشود که جناب butterfly8528 از ایندستور برای بررسی وضعیت کامپایل برنامه استفاده کرده اند، درتابع پست 4 در ابتدای اجرا bEXE برابر True مقدار دهی میشود و بدین معنی است که برنامه exe است یعنی کامپایل شده است اما اگرخلاف این باشد یعنی برنامه در حال نوشتن باشد پس تابع Debug اجرا شده و مجددا" روال را اجرا و bEXE را برابر False میکند (البته دوباره محتویات شرط اجرا نمیشود چون شرط اجرای بلوک False بودن bEXE است) سپس خط روال به IsEXEکه در زیر Debug قرار دارد منتقل میشود و IsEXEبرابر مقدار bEXE مقدار دهی میشود که اگر bEXE=False باشد IsEXE نیز False برمیگردد یعنی برنامه کامپایل نشده است

موفق باشید

king ag
پنج شنبه 27 مرداد 1390, 20:38 عصر
سلام خدمت تمام دوستان عزیز
الان ما یک پروژه داریم که 10 تا فرم داره
ولی 1 فرمش هیده
میخوایم وقتی اگر پروژه به اتمام رسید اون هید ها هم آنلود بشند
یعنی باید این کد رو تو آنلود هر 9 تا فرم دیگه بنویسیم؟
ممنون
موفق باشید

setroyd
پنج شنبه 27 مرداد 1390, 21:01 عصر
متشکر.
فقط یه چیزی:
من نمیدونم کلا برنامه ای که دارم مینویسم چه اشکالی داره که خیلی اذیت میکرد و میکنه(حتی قبل استفاده از روش های شما)
مثلا 2 بار که از تو سورس برنامه رو اجرا میکنم یکدفعه پیغام میاد از طرف ویندوز (همون پیغام که مایکروسافت معذرت خواهی میکنه و گزینهی Dont Send داره) بعدشم ویبی بسته میشه.
خیلی حالمو گرفته.

و فکر میکنم همه اینها زیر سر اون ساعت آنالوگی هست که استفاده میکنم.
البته ساعته سورس هست و کامپوننت نیست.

اگه بتونین کمکم کنین واقعا لطف بزرگی میکنین.
ممنون.
حتما مشکل از کد نویسی هست یا ocx هایی که استفاده کردی مشکل از vb نیست چک کن دیباگ کن ببین مشکل از کجاست

IamOverlord
پنج شنبه 27 مرداد 1390, 21:03 عصر
فکر نکنم، چون اون Form های دیگه هم همشون واسه یه Process واحد هستن دیگه.

setroyd
پنج شنبه 27 مرداد 1390, 21:19 عصر
نه نیازی نیست همش بسته میشه تو فرم اصلیت بنویس فقط همین !

king ag
پنج شنبه 27 مرداد 1390, 22:20 عصر
خوب الان فرم اصلیم هر 9 تا میتونند باشن
شما فرض کن یک برنامه داری با 10 تا منو
یکیشون رو مجبوری با هید ببندی چون میخوای تغییرات آنی بمونه ولی بعدا سیو نشه
ولی فرم های دیگه رو آنلود میکنی
در این حالت هم یک فرم جواب میده؟؟

setroyd
پنج شنبه 27 مرداد 1390, 23:32 عصر
نه منظورم از فرم اصلی فرم نبود ! فرم اصلی یعنی اون فرم که برنامه اصلیتو میسازه منظورمه هیچ فرقی نداره تو هر کدوم بنویسی میبنده کل فرم هارو .

محسن واژدی
پنج شنبه 27 مرداد 1390, 23:33 عصر
خوب الان فرم اصلیم هر 9 تا میتونند باشن
شما فرض کن یک برنامه داری با 10 تا منو
یکیشون رو مجبوری با هید ببندی چون میخوای تغییرات آنی بمونه ولی بعدا سیو نشه
ولی فرم های دیگه رو آنلود میکنی
در این حالت هم یک فرم جواب میده؟؟

برای unload کردن همه فرم های بارگذاری شده دستور زیر را در یک ماژول کپی کنین سپس به منظور خروج انرا اجرا کنین:

Public Sub ExitMe()
On Error Resume Next
Dim fForm
For Each fForm In Forms
Unload fForm
Next
End Sub

موفق باشید

setroyd
پنج شنبه 27 مرداد 1390, 23:34 عصر
چرا یکم وقط نمیذارین و خودتون امتحان نمیکنید تا خوب متوجه شید !!!!!!!!

farboodj1375
پنج شنبه 27 مرداد 1390, 23:48 عصر
چک کن دیباگ کن ببین مشکل از کجاست

خیلی ممنون ولی اگه دقت میکردین گفتم ویندوز پیغام خطا میده نه برنامه.پس نمیشه دیبگ کرد.
خطای ویندوز هم همونی هست که خیل وقت ها میده و متنش هم تقریبا اینه:
We are sorry.Tel Microsoft about this problem.
دو تا گزینه هم داره که Send Error و Dont Send هستند.

محسن واژدی
جمعه 28 مرداد 1390, 00:35 صبح
خیلی ممنون ولی اگه دقت میکردین گفتم ویندوز پیغام خطا میده نه برنامه.پس نمیشه دیبگ کرد.
خطای ویندوز هم همونی هست که خیل وقت ها میده و متنش هم تقریبا اینه:
We are sorry.Tel Microsoft about this problem.
دو تا گزینه هم داره که Send Error و Dont Send هستند.


http://barnamenevis.org/showthread.php?300755-%D8%AE%D8%A7%D8%B1%D8%AC-%D9%86%D9%85%D9%88%D8%AF%D9%86-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D8%A7%D8%B2-%D8%AD%D8%A7%D9%81%D8%B8%D9%87-%D8%A8%D9%87-%D8%B5%D9%88%D8%B1%D8%AA-%D9%83%D8%A7%D9%85%D9%84...&p=1319838&viewfull=1#post1319838