PDA

View Full Version : اجرای فقط یک نسخه از برنامه



Bahram0110
سه شنبه 22 اسفند 1385, 09:17 صبح
به نظر شما بهترین روش برای اینکه برنامه حتی اگه از مسیر های متفاوت اجرا بشه و یا با نامهای مختلفی اجرا بشه ، فقط یک نسخه از اون اجرا بشه!

shamsoft
سه شنبه 22 اسفند 1385, 14:51 عصر
خب یه مقدار مثلا تو رجیستری ذخیره کن و مقدارش هم بزار 0
هر وقت برنامه اجرا شد چک کنه که اگر بزرگتر مساوی 1 بود برنامه رو ببنده
بعدش هم مقداری رو که توی رجیستری ذخیره کردی +1 کن
ولی خب اگه ویندوز عوض بشه اون مقدار هم دوباره صفر میشه. این طوری احتمال کرک شدن برنامه هم زیاده

__siavash__
سه شنبه 22 اسفند 1385, 19:53 عصر
ببین منظورت اینه !!!
البته این اگه از جای دیگه اجرا بشه برنامه باز میشه که جواب شما رو نمیده

__siavash__
سه شنبه 22 اسفند 1385, 20:04 عصر
یا اینکه شما بیاید در رویدا فرم لود با تابع FindWindow پنجره ی برنامه خودتونو پیدا کنید اگه پیدا نشد اجازه ی باز شدن برنامه رو بدید اگه نه برنامه unload بشه

shamsoft
سه شنبه 22 اسفند 1385, 22:45 عصر
پست آقا سیاوش رو که خوندم فهمیدم که منظورتون رو نفهمیده بودم. ببخشید. حالا فهمیدم چی می خواید

coder
چهارشنبه 23 اسفند 1385, 15:37 عصر
If App.PrevInstance Then End

__siavash__
چهارشنبه 23 اسفند 1385, 16:05 عصر
coder (http://barnamenevis.org/forum/member.php?u=8799)
این دستور فقط برنامه با همان اسم و در همان دایرکتوری که از آنجا اجرا شده رو مانع باز شدنش میشه
اما اگه شما در همون دایرکتوری اسم برنامه رو عوض کنی یا برنامه با همون اسم رو در یه جای دیگه کپی کنی و از اون جا اجرا کنی دیگه جواب نمیده و یه نسخه دیگه ازش باز میشه

CodeMasterX
چهارشنبه 23 اسفند 1385, 17:02 عصر
همون مثالی که coder زده کافیه.
توی قسمت Initialize مربوط به فرم StartUp برنامه ات این کد رو بنویس:

If App.pRevInstance Then End

__siavash__
چهارشنبه 23 اسفند 1385, 17:37 عصر
CodeMasterX (http://barnamenevis.org/forum/member.php?u=34556)
خوب شما یه امتحان بکن
من که وقتی امتحان میکنم همون اتفاقی میوفته که در بالا گفتم ولی قرار است که برنامه به هیچ وجه دو نسخه ازش باز نشه !!!
Bahram0110 (http://barnamenevis.org/forum/member.php?u=14281)
ظاهرا همون API که در بالا گفتم جواب میده ! مگر اینکه یه پنجرای دیگه با نام کلاس و کپشن پنجره ی شما وجود داشته باشه که به نظر من بعیده

Bahram0110
پنج شنبه 24 اسفند 1385, 12:17 عصر
پست آقا سیاوش رو که خوندم فهمیدم که منظورتون رو نفهمیده بودم. ببخشید. حالا فهمیدم چی می خواید

اتفاقا من فکر می کنم که فقط شما فهمیدین چون هیچ یک از جواب ها و ضمیمه های دوستان با سوال من جور نبود
شاید با روشی که شما گفتید بشه یه کارهایی کرد ولی بازم روشتون کامل نیست

Bahram0110
پنج شنبه 24 اسفند 1385, 12:19 عصر
دوستان مثل اینکه منظور منو نفهمیدن
لطفا با دقت پست اولی منو بخونید

Bahram0110
پنج شنبه 24 اسفند 1385, 12:35 عصر
دوستان مثل اینکه منظور منو نفهمیدن
لطفا با دقت پست اولی منو بخونید

__siavash__
پنج شنبه 24 اسفند 1385, 13:31 عصر
به نظر شما بهترین روش برای اینکه برنامه حتی اگه ازمسیر های متفاوت اجرا بشه و یا با نامهای مختلفی اجرا بشه ، فقط یک نسخه از اون اجرا بشه


جمله شما ایهام داره ! چند تا برداشت میشه کرد :

1.یعنی برنامه شما که به صورت .exe است و در یک پوشه قرار دارد بعد از کلید کردن اجرا بشه و تا زمانی که برنامه باز است اگر روی این فایل exe کلیک شد مثلا پیغام بده که یه نسخه از برنامه باز است و برنامه بسته بشه (اون برنامه که باز بوده کناکان باز هست، دومی بسته میشه)
2.برنامه روی این ویندوز فقط یک بار اجرا بشه
3.برنامه در این کامپوتر فقط یک بار اجرا شود
حالا منظورت کدومه ؟

romina2006
پنج شنبه 24 اسفند 1385, 21:49 عصر
Dim filename As String
Public Function DoesFileExist(filename As String) As Boolean
DoesFileExist = Dir(filename) <> ""
If DoesFileExist Then
MsgBox "This Program is Running", vbExclamation
End
Else
Open filename For Random As #1
Close #1
End If
End Function
Private Sub Form_Load()
DoesFileExist ("c:\Romina2006")
End Sub
Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
Kill "c:\Romina2006"
End Sub


اینم امتحان کن

Bahram0110
جمعه 25 اسفند 1385, 11:20 صبح
دوستان عزیز
من می دونم که دستور app.pervinstance باعث می شه که فقط یه نسخه از برنامه اجرا بمونه
ولی اگه مثلا برنامهء‌ما به نام Project1 در درایو C‌باشد آن را دو بار اجرا کنیم با دستوری که شما گفتید بار دوم اجرا نمی شه
ولی اگه Project1 رو به مثلا درایو D کپی کنیم یا در همون درایو C یه کپی ازش بگیریم و کپی رو تغییر نام بدیم و اونو اجرا کنیم در این دو صورت دیگه دستور App.previnstance جوابگو نیست!
من مشکلم همینه!
می خوام مثلا کسی که بار اول فایل رو اجرا کردنفر دومی نیاد اونو از یه جای دیگه اجرا کنه
به خدا دیگه نمی دونم با چه زبونی بگم
اگه بازم توضیح خواستین بگین!!!!!!!!!!!!!!!!!
البته من هنوز برنامهء دوستم romina2006 رو امتحان نکردم
با تشکر از همه

Bahram0110
جمعه 25 اسفند 1385, 11:23 صبح
Dim filename As String
Public Function DoesFileExist(filename As String) As Boolean
DoesFileExist = Dir(filename) <> ""
If DoesFileExist Then
MsgBox "This Program is Running", vbExclamation
End
Else
Open filename For Random As #1
Close #1
End If
End Function
Private Sub Form_Load()
DoesFileExist ("c:\Romina2006")
End Sub
Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
Kill "c:\Romina2006"
End Sub




اتفاقا من هم همین فکر تو سرم بود
ولی اگه کاربر Limited باشه دیگه امکان ایجاد فایل تو مثلا درایو C وجود نداره
پس این راه هم جواب نمی ده

romina2006
جمعه 25 اسفند 1385, 13:20 عصر
کد اولی در یوزر لیمیت کار نمی کنه ولی می تونی از سورس برنامه دومی که از طریق رجیستری کار می کنه اسفاده کنی.اون کد در یوزر لیمیت کار می کنه

adaman
جمعه 25 اسفند 1385, 15:29 عصر
ولی اگه کاربر Limited باشه دیگه امکان ایجاد فایل تو مثلا درایو C وجود نداره
شاخه temp همیشه در دسترسه
گذشته از این این دو روش یه مشکل اساسی دارن
این که امکان داره برنامه در حال اجرا باشه و برقا برن ،یا اینکه توسط کاربر End Process بشه
در این حالت برنامه دیگه هیچ وقت اجرا نمیشه
با یه شرط دیگه این مشکل حل میشه ، اینکه اگه برنامه در حالت نرمال بسته شه ....
فک کنم بقیه اش واضحه

__siavash__
جمعه 25 اسفند 1385, 16:39 عصر
adaman (http://barnamenevis.org/forum/member.php?u=29937)
حرف شما درسته ولی اگر توی اون کدی که Romina2006 گذاشته بود و از طریق ریجستری این کار رو میکرد در تابع CreateKey اون قسمت که از تابع API رو به رو استفاده کرده RegCreateKeyEx در پارامتر پنجم به جای صفر ، یک رو قرار بدیم کلید ایجاد شده بعد از خاموش شدن کامپیوتر پاک میشود و سیو نمیشود !!!

romina2006
جمعه 25 اسفند 1385, 19:23 عصر
Dim filename As String
Public Function DoesFileExist(filename As String) As Boolean
DoesFileExist = Dir(filename) <> ""
If DoesFileExist Then
MsgBox "This Program is Running", vbExclamation
End
Else
Open filename For Random As #1
Close #1
End If
End Function
Public Function DoesDirectoryExist(DirPath As String) As Boolean
DoesDirectoryExist = Dir(DirPath, vbDirectory) <> ""
If DoesDirectoryExist Then
Exit Function
Else
MkDir ("c:\Romina2006")
End If
End Function
Private Sub Form_Load()
On Error Resume Next
DoesDirectoryExist ("c:\Romina2006")
DoesFileExist ("c:\Romina2006\Romina2006")
End Sub
Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
On Error Resume Next
Kill "c:\Romina2006\Romina2006"
RmDir ("c:\Romina2006")
End Sub
Private Sub Form_Unload(Cancel As Integer)
On Error Resume Next
Kill "c:\Romina2006\Romina2006"
RmDir ("c:\Romina2006")
End Sub


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

Bahram0110
جمعه 25 اسفند 1385, 19:31 عصر
من اصلا نمی خوام توی هیچ فایلی بنویسم
تو رجیستری نوشتن به نظر من معقول تره که اگه برنامه به صورت غیر نرمال بسته بشه دیگه برنامه اجرا نمی شه
البته اینکه دوستمون گفتند "در پارامتر پنجم به جای صفر عدد یک را قرار دهید . . . " اگه جواب بده مشکل حل شده

CodeMasterX
جمعه 25 اسفند 1385, 20:35 عصر
آقا نیازی به این همه کد نویسی و بالا و پائین نداره که!
من مثال خودم رو بارها استفاده کردم و داره کار می کنه،شما توی قسمت Initialize مروط به فرم StarUp برنامتون این کد رو قبل از هر کد دیگه ای بنویسید:



If App.PrevInstance = True Then
End
End If

__siavash__
جمعه 25 اسفند 1385, 21:06 عصر
CodeMasterX (http://barnamenevis.org/forum/member.php?u=34556)
اون کد جواب نمیده! من برای اطمینان یه بار دیگه امتحان کردم! یه بار حالتهای مختلفشو امتحان کن (مثلا اسم برنامه رو عوض کن نتیجشو ببین)
Bahram0110 (http://barnamenevis.org/forum/member.php?u=14281)
اگه پارامتر پنجم یک باشه دیگه هیچ مشکلی نیست من همین الان هم با صفر امتحان کردم هم با یک و همون طور که انتظار داشتم جواب داد! من فکر میکنم اون کد دقیقا کار میکنه و هیچ مشکلی نداره

Bahram0110
شنبه 26 اسفند 1385, 11:01 صبح
آقا نیازی به این همه کد نویسی و بالا و پائین نداره که!
من مثال خودم رو بارها استفاده کردم و داره کار می کنه،شما توی قسمت Initialize مروط به فرم StarUp برنامتون این کد رو قبل از هر کد دیگه ای بنویسید:



If App.PrevInstance = True Then
End
End If


حالا چرا اینقد رو کدت تاکید داری؟؟؟؟؟؟؟؟؟؟
بابا اگه این کد جواب می داد که من دیگه این سوالو نمی پرسیدم
اصلا یه بار هم صورت سوال منو خوندی؟

CodeMasterX
شنبه 26 اسفند 1385, 17:56 عصر
با عرض شرمندگی به همه دوستان!
من اسم فایل اجرایی رو عوض کردم و این کد خودم جواب نداد! فکر می کنم کدی که romina نوشته بود خوب باشه. اشتباه شده دیگه، پیش میاد ! :D

romina2006
چهارشنبه 01 فروردین 1386, 00:33 صبح
این دو تا کد رو امتحان کن ببین چطورند

american_iran2006
چهارشنبه 01 فروردین 1386, 01:26 صبح
سلام ::

چرا از دو شرط به طوره همزمان استفاده نمیکنی ؟؟؟؟؟؟؟؟

که اگه اولی به خاطر رفتن برق اشتباه باشه اما دومی درست باشه

یا اگه دومی rename شد ؛ شرط اول بر قرار باشه!!!!!!!!!!!!!!!!!!!!!!!!!

CodeMasterX
چهارشنبه 01 فروردین 1386, 06:33 صبح
خوب تا اونجایی که معلوم شد تابع PrevInstance خود ویژوال بیسیک نام فایل و مکان اجرای فایل رو در نظر نمی گیره.این ماژول رو استفاده کنید ببینید بعتون حواب میده یا نه، چیز خوبی هست! :چشمک:

Bahram0110
چهارشنبه 01 فروردین 1386, 14:19 عصر
از همکاری همهء دوستان ممنونم
سال خوبی داشته باشین

adaman
پنج شنبه 02 فروردین 1386, 04:10 صبح
این دو تا کد رو امتحان کن ببین چطورند
اینا فک کنم اگه برنامه در شرایط غیر نرمال بسته شه بازم جواب نمی دن
با یه الگوریتم ساده میشه این مشکل رو حل کرد
مثل این :
http://h1.ripside.net/anti43/Temp/Check_Run.rar