Just nu i M3-nätverket
Gå till innehåll

Kontrollera om programmet körs!?


Sergeant

Rekommendera Poster

Hur gör jag om jag inte vill att flera processer av mitt program startas, så att bara en process körs med programmet.

 

Annars kan användaren öppna programemt flera gånger och det blir inge vidare!?

 

Tack för svar

Erik

 

Länk till kommentar
Dela på andra webbplatser

När programmet startar upp, leta igenom systemets processer (EnumProcesses). Hittar du en instans av programmet så avslutar du programmet

 

 

Länk till kommentar
Dela på andra webbplatser

Jag körde en liten snabbtitt med API Viewer och hittade inget som hette EnumProcesses, du skulle inte kunna skriva hur man deklarerar den och hur man bär sig åt sedan, d viktigaste är hur jag ska deklarera den!

 

tack för svaret

Erik

 

Länk till kommentar
Dela på andra webbplatser

Jajjmensan!

 

Programmeringsspråket e VB6 SP6

Operativ XP Pro SP 2!

 

Räcker det lr behövs d nåt mer?

 

Erik

 

 

 

Länk till kommentar
Dela på andra webbplatser

Den ligger i PSAPI.DLL:

 

Public Declare Function EnumProcesses Lib "PSAPI.DLL" (lpidProcess As Long, ByVal cb As Long, cbNeeded As Long) As Long

 

Det är inte en helt simpel process att göra det här. EnumProcess ger dig en array med ProcessId, för varje id måste du hämta processhanteraren osv. tills du har namnet på processen. Jag kan hjälpa dig en bit på vägen...

 

Följande funktion loopar igenom alla processer och ger dig hanteraren för varje process.

[log]

[color="#0000ff"]Private[/color] Declare [color="#0000ff"]Function[/color] EnumProcesses Lib [GRÅ]"PSAPI.DLL"[/GRÅ] (lpidProcess As Long, ByVal cb As Long, cbNeeded As Long) As Long
[color="#0000ff"]Private[/color] Declare [color="#0000ff"]Function[/color] OpenProcess Lib [GRÅ]"kernel32"[/GRÅ] (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
[color="#0000ff"]Private[/color] Declare [color="#0000ff"]Function[/color] CloseHandle Lib [GRÅ]"kernel32"[/GRÅ] (ByVal hObject As Long) As Long

[color="#0000ff"]Public[/color] [color="#0000ff"]Sub[/color] CheckProcesses()
    [color="#0000ff"]Dim[/color] aProcesses() As Long
    [color="#0000ff"]Dim[/color] cbNeeded As Long
    [color="#0000ff"]Dim[/color] cProcesses As Long
    [color="#0000ff"]Dim[/color] hProcess As Long
    [color="#0000ff"]ReDim[/color] aProcesses(0 [color="#0000ff"]To[/color] 1023) As Long
    [color="#0000ff"]If[/color] (EnumProcesses(aProcesses(0), 1024 * 4, cbNeeded) <> 0) [color="#0000ff"]Then[/color]
        cProcesses = cbNeeded / 4
        [color="#0000ff"]For[/color] i = 0 [color="#0000ff"]To[/color] cProcesses
            lProcessID = aProcesses(i)
            hProcess = OpenProcess(PROCESS_QUERY_INFORMATION Or PROCESS_VM_READ, 0, lProcessID)
            [color="#006400"]' hProcess är hanteraren för aktuell process i listan[/color]
        [color="#0000ff"]Next[/color]
    [color="#0000ff"]End[/color] [color="#0000ff"]If[/color]
    CloseHandle hProcess
[color="#0000ff"]End[/color] [color="#0000ff"]Sub[/color]

[/log]

 

Länk till kommentar
Dela på andra webbplatser

Schyrre byrre, tack så mycket!

 

Fråga, hprocess, är det namnet på processen?

 

isf så skulle jag ju helt enkelt kunna lägga in en if sats och checka varje hprocess om namnet stämmer överens med mitt programs namn?

 

Om man ändrar namn på programmet så skulle det helt enkelt vara möjligt att starta ytterliggare en process?

 

har jag fattat allting rätt?

 

Tack så mycket för förklaringen!

 

Erik

 

Länk till kommentar
Dela på andra webbplatser

För din del kanske det räcker att använda den här koden i programmet

Lägg in den i Form_Load()

 

 

If App.PrevInstance = True Then

'MsgBox "Det finns redan ett program startat"

Unload Me

 

End If

 

--- Vaios ---

 

Länk till kommentar
Dela på andra webbplatser

Varför krångla till det. Gör så här:

    [color="#0000ff"]If[/color] App.PrevInstance [color="#0000ff"]Then[/color]
        [color="#0000ff"]End[/color]
    [color="#0000ff"]End[/color] [color="#0000ff"]If[/color]

 

Läs mer på http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vb98/html/vbproPrevInstance.asp

 

Länk till kommentar
Dela på andra webbplatser

Arkiverat

Det här ämnet är nu arkiverat och är stängt för ytterligare svar.

×
×
  • Skapa nytt...