Manfred Skrevet 20. mars 2007 Del Skrevet 20. mars 2007 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
Moskus Skrevet 20. mars 2007 Del Skrevet 20. mars 2007 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
Manfred Skrevet 20. mars 2007 Forfatter Del Skrevet 20. mars 2007 (endret) 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 20. mars 2007 av Manfred Lenke til kommentar
Moskus Skrevet 20. mars 2007 Del Skrevet 20. mars 2007 Men da tar jeg et poeng allikevel! Jeg har fortjent det (som må høre på den jævla VB-bashinga di. Grow up!). Uansett: CommandlineArgs() henter vel bl.a. ut om programmet faktisk er startet før eller ikke? Lenke til kommentar
Manfred Skrevet 21. mars 2007 Forfatter Del Skrevet 21. mars 2007 Et par problemer her. Skal _mtxFirstInstance bare være et "object"? Hva er _thThread? Den er ikke definert noe sted. "NewInstanceEventArgs" eksisterer ikke i .net-rammeverket iflg. Help ... Noen som har noen andre forslag? Lenke til kommentar
Moskus Skrevet 21. mars 2007 Del Skrevet 21. mars 2007 (endret) 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 21. mars 2007 av moskus Lenke til kommentar
Spartakus Skrevet 21. mars 2007 Del Skrevet 21. mars 2007 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
Manfred Skrevet 21. mars 2007 Forfatter Del Skrevet 21. mars 2007 (endret) 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 Edit2: OG fått med at du må ha "out bolIsCreated" som tredje argument til Mutex-constructoren Endret 21. mars 2007 av Manfred Lenke til kommentar
Moskus Skrevet 21. mars 2007 Del Skrevet 21. mars 2007 (endret) Pfft på deg. Teh point is mine, MUHAHA! I r teh win. Endret 21. mars 2007 av moskus Lenke til kommentar
Anbefalte innlegg
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 kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå