PDA

View Full Version : یک نکته کوچک :: چگونه فقط یک نسخه از برنامه اجرا بشه !!!!



Mahdavi
چهارشنبه 13 اسفند 1382, 23:37 عصر
با سلام
بعضی وقتها می خواهیم فقط یک نسخه از برنامه ما اجرا شود .

برای این کار ابتدا تمام پروسسهای ویندوز را چک می کنیم تا اگه برنامه ای با همان نام پیدا شد ، محل اجرای آن را چک میکند و ......


using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;
using System.Diagnostics;
using System.Reflection;

public class OneInstnace
{
[STAThread]
public static void Main()
{
//Get the running instance.
Process instance = RunningInstance();
if (instance == null)
{
//There isn't another instance, show our form.
Application.Run (new Form());
}
else
{
//There is another instance of this process.
HandleRunningInstance(instance);
}
}
public static Process RunningInstance()
{
Process current = Process.GetCurrentProcess();
Process[] processes = Process.GetProcessesByName (current.ProcessName);

//Loop through the running processes in with the same name
foreach (Process process in processes)
{
//Ignore the current process
if (process.Id != current.Id)
{
//Make sure that the process is running from the exe file.
if (Assembly.GetExecutingAssembly().Location.Repla ce("/", "\\") ==
current.MainModule.FileName)
{
//Return the other process instance.
return process;
}
}
}

//No other instance was found, return null.
return null;
}


public static void HandleRunningInstance(Process instance)
{
//Make sure the window is not minimized or maximized
ShowWindowAsync (instance.MainWindowHandle , WS_SHOWNORMAL);

//Set the real intance to foreground window
SetForegroundWindow (instance.MainWindowHandle);
}

[DllImport("User32.dll")]

private static extern bool ShowWindowAsync(
IntPtr hWnd, int cmdShow);
[DllImport("User32.dll")] private static extern bool
SetForegroundWindow(IntPtr hWnd);
private const int WS_SHOWNORMAL = 1;
}

منبع : سایت c-sharpcorner

احمد سامعی
شنبه 15 مهر 1385, 14:12 عصر
با سلام
بعضی وقتها می خواهیم فقط یک نسخه از برنامه ما اجرا شود .

برای این کار ابتدا تمام پروسسهای ویندوز را چک می کنیم تا اگه برنامه ای با همان نام پیدا شد ، محل اجرای آن را چک میکند و ......



ببخشید استاد این کد شما کار نمی کنه ( تو برنامه های خودتون کار می کنه ؟)
(در ضمن قبل از استفاده از این کد وقتی برنامه ران بود و دوباره کمپایل می کردی دانت نت ارور می داد اما با این کد خود دانت نت هم غات زد و چند تا از برنامه رو باز می کنه )

لطفا راهنمایی کنید یا اگه اصلاح شدش رو دارید بزارید
با تشکر
احمد سامعی

محمد میرمصطفی
شنبه 15 مهر 1385, 15:11 عصر
دوست من، روش شما عالیه، ولی من روش استفاده از mutex رو ترجیح می دم. البته روش شما یه سری مزایا نسبت به mutex داره.

leilav_1984
یک شنبه 04 شهریور 1386, 11:53 صبح
دوست من، روش شما عالیه، ولی من روش استفاده از mutex رو ترجیح می دم. البته روش شما یه سری مزایا نسبت به mutex داره.

لطفا راجع به این mutex راهنمایی بفرمایید

PC2st
یک شنبه 04 شهریور 1386, 18:40 عصر
به لینک زیر مراجعه کنید، مطالب خوبی رو می بینی:
http://us.geocities.com/noxcupid/
http://us.geocities.com/noxcupid/2_18.htm

jghalai
دوشنبه 13 اسفند 1386, 08:00 صبح
با سلام مطلب شما جالب بود و به درد من ه م خیلی می خوره . ولی من یه مشکل دیگل دیگه هم دارم:

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

می تونین کمکم کنید چون خیلی به جواب این سوال احتیاج دارم.

hassan razavi
دوشنبه 13 اسفند 1386, 08:20 صبح
منظورتون از اینکه Dll فقط یکبار اجرا بشه چیه ؟ واضحتر توضیح بدبد که این Dll تون چی هست و چه کار میکنه و چه جوری پیاده سازی شده.
چندین راه وجود داره. می تونید از الگوریتم Singleton یا متدهای استاتیک استفاده کنید.
فقط باید روشن تر توضیح بدهید

jghalai
دوشنبه 13 اسفند 1386, 17:39 عصر
مثل اینکه با هر بار اجرای App تمام Dll های استفاده شده یک بار برای Applicaion تازه باز شده اجرا می شوند . منظورم یک کپی از آنها است نه خود آنها به همین دلیل الگوریتم singleton و متدهای static هم هیچ کمکی نمیکنند. حالا من میخوام که این Dll ها به ازای هر تعداد app باز شده فقط وفقط یک بار در حافظه بار شوند.