Gå til innhold

Registrere application Mutex i .net?


Anbefalte innlegg

Jeg bare lurte: Kan man registrere en "Application Mutex" i .net (tror det ligger i kernel32.dll). Det jeg skal bruke den til er å sette et mutex name for applikasjonen min, slik at (av)installasjonsprogrammet kan sjekke om programmet kjører.

 

For å få en melding a'la: "[setup or Uninstall] has detected that [AppName] is currently running. Please close all instances of it now, then click OK to continue, or Cancel to exit."

 

i C gjør man det slik:

 

CreateMutex(NULL, FALSE, "MyProgramsMutexName");

 

og i VB (ikke .net) slik:

'Place in Declarations section:
Private Declare Function CreateMutex Lib "kernel32" _
       Alias "CreateMutexA" _
      (ByVal lpMutexAttributes As Long, _
       ByVal bInitialOwner As Long, _
       ByVal lpName As String) As Long

'Place in startup code (Form_Load or Sub Main):
CreateMutex 0&, 0&, "MyProgramsMutexName"

 

Men hva med .net? (helst da C#)

Lenke til kommentar
Videoannonse
Annonse

Jeg selv bruke noe herfra som gjør det du vil gjøre, hvis jeg forstod det rett. Men det er uheldigvis (for deg) i VB, men jeg skal ha poeng for å ha gjort et forsøk på å finne noe for C#. :)

 

Shared Sub New()
   Dim refIsCreated As Boolean
   _mtxFirstInstance = New Threading.Mutex(True, Name, refIsCreated)
   IsAlreadyStarted = Not refIsCreated
   If IsAlreadyStarted = False Then
       _thrThread.Start()
   Else
       Dim ms As New IO.MemoryStream()
       Dim bf As New System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
       bf.Serialize(ms, New NewInstanceEventArgs(System.Environment.GetCommandLineArgs()))
       ms.Flush()
       Dim np As New NamedPipe(Name)
       np.OpenExisting()
       np.Write(ms.GetBuffer())
       np.Close()
       ms.Close()
   End If
End Sub

Lenke til kommentar

Dette ser bra ut :)

 

Jeg klarer å lese og "oversette" fra vb da... Ingen VB-utviklere får poeng av meg ;) hehe.

 

men en ting...

bf.Serialize(ms, New NewInstanceEventArgs(System.Environment.GetCommandLineArgs()))

Hvorfor skal man hente commandLineArgs her?

Endret av Manfred
Lenke til kommentar

Gjorde en kjapp test, og dette fungerer jo som bare pokker. :)

 

    Private mut As Threading.Mutex

   Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
       Dim bolIsCreated As Boolean
       mut = New Threading.Mutex(True, "MittAppNavn", bolIsCreated)

       MsgBox("Is created in Mutex: " & bolIsCreated)
   End Sub

 

Første gang programmet startes er bolIsCreaded = TRUE. Startes det flere ganger etter det så er bolIsCreated = FALSE. Avsluttes alle og det startes en instans så blir bolIsCreated = TRUE.

 

Fantastisk. :)

 

 

 

EDIT: Konverterte dette til C#. Sånn bare for å være grei. :)

private Threading.Mutex thr;

private void Form1_Load(object sender, System.EventArgs e)
{
bool bolIsCreated;
thr = new Threading.Mutex(true, "MittAppNavn", bolIsCreated);
MsgBox("Is created in Mutex: " + bolIsCreated);
}

Endret av moskus
Lenke til kommentar

bool letmebetheonlyone;
System.Threading.Mutex mutex = new Mutex(false, "Local\\MyApp", out letmebetheonlyone);
if(letmebetheonlyone)
   MessageBox.Show("I was here first!");
else
   MessageBox.Show("Someone beat me to it!");

Den "Local\" geria skal visstnok sørge for mutexen eksisterer på tvers av brukere.

Lenke til kommentar
Gjorde en kjapp test, og dette fungerer jo som bare pokker. :)

 

    Private mut As Threading.Mutex

   Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
       Dim bolIsCreated As Boolean
       mut = New Threading.Mutex(True, "MittAppNavn", bolIsCreated)

       MsgBox("Is created in Mutex: " & bolIsCreated)
   End Sub

 

Første gang programmet startes er bolIsCreaded = TRUE. Startes det flere ganger etter det så er bolIsCreated = FALSE. Avsluttes alle og det startes en instans så blir bolIsCreated = TRUE.

 

Fantastisk. :)

 

 

 

EDIT: Konverterte dette til C#. Sånn bare for å være grei. :)

private Threading.Mutex thr;

private void Form1_Load(object sender, System.EventArgs e)
{
bool bolIsCreated;
thr = new Threading.Mutex(true, "MittAppNavn", bolIsCreated);
MsgBox("Is created in Mutex: " + bolIsCreated);
}

8202247[/snapback]

Kanskje du skal få et lite poeng likevel da ;)

 

 

Edit: Trekker tilbake poenget... Du hadde fått et poeng om du hadde brukt riktig syntax for å vise message boxen :p

 

Edit2: OG fått med at du må ha "out bolIsCreated" som tredje argument til Mutex-constructoren ;)

Endret av Manfred
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...