با توجه به اینکه درمورد سوال قبلیم که لینکش در پایین است با دوستان به نتیجه ای نرسیدیم
http://www.iranvig.com/modules.php?name=...pic&t=2626
من برای رفع مشکل برنامم یه فکری به ذهنم رسید که به کمک شما دوستان نیازمندم
سوال اول : چکار کنم که برنامه بیش از یک بار اجرا نشه ؟
سوال دوم : چجوری با توجه به نام یک پروسس بفهمیم که آن پروسس وجود دارد یا نه و یا به عبارت دیگر برنامه با نام مشخص در ليست پروسس در حال اجرا است یا نه ؟
دوست عزیز برای سوال اولتون یه راه به ذهنم رسید.شما می تونید توی رجیستری یه کلید ایجاد کنید و مقدار اونو 0 قرار بدید و توی قسمت Form_load دو تا کار زیر رو انجام بدید.
اول اینکه در شروع برنامه یه سر به کلید مورد نظر در رجیستری بزنید و مقدار اونو +1 کنید.
بعد یه شرط بزارید که اگر مقدار کلید، در رجیستری به مقدار مورد نظر شما (که در این سوال 1 هست) رسید برنامه دیگه اجرانشه.(unload me )
سوال دوم رو هم بلد نیستم.
App.PrevInstance از این کد استفاده کن و در هنگام اجرای برنامه در if اون رو چک کن
نقل قول: App.PrevInstance از این کد استفاده کن و در هنگام اجرای برنامه در if اون رو چک کن
دمت گرم
اينو چند وقت پيش تو يه سايتي ديده بودم
ولي هر چي فكر كردم چيزي يادم نيومد
ظمنا راه shamsoft جان عملي است ولي وقتي يه
راه ساده تر وجود داره چرا ديگه آدم اين كار كنه
من دنبال اين كد بودم.
از همگي ممنون
حالا سوال دوم موند ؟
ببخشيد ديگه من خيلي وي بي كار نكردم و از اين جور تابع ها بلد نيستم.راهي كه به نظر من رسيد بهتون گفتم و از وجود اون تابع اطلاعي نداشتم.
همين كه به فكري ما هستي مهمه و ارزش داره
خواهش مي كنم.وظيفه است.مگه يادتون رفته چند رو ز پيش چقدر توي سوالات به من كمك كرديد.(چهار تا سوال ساده) :wink:
جواب سوال دو رو هم پيدا كردم و اين پست با موفقيت به اتمام رسيد
تابع تشخيص وجود يك پروسس رو نوشتم اينم كدش؛ اگه كسي مي خواهد استفاده كنه
کد:
Private Function ExistProcess(ProcessName As String) As Long
Dim HSnapshot As Long
Dim Info As PROCESSENTRY32
Dim FirPro As Long
Dim ExeFile As String
Dim TmpPro As String
HSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0)
Info.dwSize = Len(Info)
FirPro = Process32First(HSnapshot, Info)
While FirPro <> 0
ExeFile = Info.szExeFile
TmpPro = TmpPro & " " & ExeFile
Info.dwSize = Len(Info)
FirPro = Process32Next(HSnapshot, Info)
Wend
CloseHandle HSnapshot
If InStr(TmpPro, ProcessName) <> 0 Then
ExistProcess = 1
End If
End Function
اينم متعلقاتش
کد:
Private Type PROCESSENTRY32
dwSize As Long
cntUsage As Long
th32ProcessID As Long
th32DefaultHeapID As Long
th32ModuleID As Long
cntThreads As Long
th32ParentProcessID As Long
pcPriClassBase As Long
dwFlags As Long
szExeFile As String * 260
End Type
Private Const TH32CS_SNAPPROCESS = &H2
Private Declare Function CreateToolhelp32Snapshot Lib "kernel32.dll" (ByVal dwFlags As Long, ByVal th32ProcessID As Long) As Long
Private Declare Function Process32First Lib "kernel32.dll" (ByVal HSnapshot As Long, Uprocess As PROCESSENTRY32) As Long
Private Declare Function Process32Next Lib "kernel32.dll" (ByVal HSnapshot As Long, Uprocess As PROCESSENTRY32) As Long
Private Declare Function CloseHandle Lib "kernel32.dll" (ByVal hObject As Long) As Long
Iron_Fist :
سوال اول : چکار کنم که برنامه بیش از یک بار اجرا نشه ؟
vb_m :
App.PrevInstance از این کد استفاده کن و در هنگام اجرای برنامه در if اون رو چک کن
-------------
سلام
میشه سورس نمونه یا کد اینجا بزارین ؟
من متوجه نشدم
ممنون
دوست عزیز مقدار App.PrevInstance زمانی که یک برنامه قبلا در حال اجرا باشه مقدار True داره در غیر آن صورت مقدارش False هست:
کد زیر رو اولین لاین اجرای برنامت بزار:
If App.PrevInstance then End
به همین سادگی موجب می شید از یک برنامه فقط یکی در حال اجرا باشه !
حواستون باشه باید کامپایل شده برنامرو تست کنید! (چرا؟)
مرسی
چون قبل از کامپایل اصلا نمیشه چند بار بازش کرد که تست کرد
-------
این کد در قسمت Form Load باشه ؟!
یا اولین لاین کد کدها ؟!
و یا در بالای بالا
Begin VB.Form Form1
که Caption و غیره مشخص شده ؟!