Just nu i M3-nätverket
Jump to content

Kontrollera om programmet körs!?


Sergeant

Recommended Posts

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

 

Link to comment
Share on other sites

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

 

 

Link to comment
Share on other sites

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

 

Link to comment
Share on other sites

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]

 

Link to comment
Share on other sites

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

 

Link to comment
Share on other sites

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 ---

 

Link to comment
Share on other sites

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

 

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.



×
×
  • Create New...