Jag skulle tycka mycket om den personen som kunde förklara hur (om det är möjligt) man "deaktiverar" möjligheten att stänga av en viss process i ett NT-system. Alltså, mitt program har en process, jag vill göra den icke möjlig att terminera. (interminabel) <---Snyggt ord ;) Vet inte riktigt hur man skulle kunna göra en process "interminabel" hehe... möjligtvis att man gör någon annan process beroende av den och på så vis "låser" den. Men ett möjligt svar på din alternativa fråga har jag, eftersom jag precis haft samma problem i ett eget projekt... Vänligt av dig att svara. Aha, i see... Du skulle ju kanske kunna köra programmet som en NT service? Kör den som administratör och se till att ingen användare har rättigheter att stänga ned tjänsten. Du kan fixa det enkelt med gamla hederliga Srvany (från NT resource kit): Jag hittade denna kod på nätet. Till Stefan Westling: Till Kenneth Hedman:Förhindra processterminering / Alternativt skapa oberoende tråd
OBS! Jag är möjligen beredd att betala kontant till den person som visar mig detta!
Alternativ:
Skulle annars vilja veta hur man skapar en oberoende tråd som kan arbeta efter att applikationen som skapade den har stängts!
Med oerhört vänliga hälsningar
Johan ForsbergSv: Förhindra processterminering / Alternativt skapa oberoende tråd
Vad jag fått erfara så finns det inget sätt att hantera riktiga trådar i VB, man kan dock använda sig av Windows API för att skapa oberoende processer. Du kan anropa exempelvis CreateProcessA eller CreateProcessW (beroende på om du använder ASCII eller Unicode) i Kernel32.dll. Här är ett litet exempel som drar igång notepad.exe i en egen process när man klickar på Form1 (om du sedan stänger ner VB-applikationen kommer du att se att notepad-instansen ligger kvar och exekvera i en egen process):
Skapa ett nytt projekt i VB6.0 (Standard EXE) och klistar in följande kod i Form1 (som skapas default):
Private Type STARTUPINFO
cb As Long
lpReserved As String
lpDesktop As String
lpTitle As String
dwX As Long
dwY As Long
dwXSize As Long
dwYSize As Long
dwXCountChars As Long
dwYCountChars As Long
dwFillAttribute As Long
dwFlags As Long
wShowWindow As Integer
cbReserved2 As Integer
lpReserved2 As Long
hStdInput As Long
hStdOutput As Long
hStdError As Long
End Type
Private Type PROCESS_INFORMATION
hProcess As Long
hThread As Long
dwProcessID As Long
dwThreadID As Long
End Type
Private Declare Function CreateProcessA Lib "kernel32" (ByVal _
lpApplicationName As Long, ByVal lpCommandLine As String, ByVal _
lpProcessAttributes As Long, ByVal lpThreadAttributes As Long, _
ByVal bInheritHandles As Long, ByVal dwCreationFlags As Long, _
ByVal lpEnvironment As Long, ByVal lpCurrentDirectory As Long, _
lpStartupInfo As STARTUPINFO, lpProcessInformation As _
PROCESS_INFORMATION) As Long
Private Sub Form_Click()
Dim cmdline As String
Dim proc As PROCESS_INFORMATION
Dim start As STARTUPINFO
cmdline = "notepad.exe"
Call CreateProcessA(0&, cmdline, 0&, 0&, 1&, &H20&, 0&, 0&, start, proc)
End Sub
Läs mer om detta här:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/createprocess.asp
Här finns även ett bra exempel hur man drar igång en process som en specifik användare (med CreateProcessWithLogon):
http://www.freevbcode.com/ShowCode.asp?ID=4298
Sv: Förhindra processterminering / Alternativt skapa oberoende tråd
Men mitt problem är att processen inte FÅR synas.
Min applikation körs nämligen just nu på leksands gymnasium och laddas via ett loginscript (Novell).
Just nu har jag två program, ett som sköter allting och kollar så att det andra programmet lever, och så det andra programmet som kontrollerar om det första programmet lever.
Programmet används för att blockera spel/program.
Eftersom det finns fler än jag som programmerar så är det möjlig (jag har provat) att terminera processerna på 2 millisekunder och mina program kontrollerar om de lever var 128:e millisekund.
Jag kan av tekniska skäl inte välja att kontrollera varje millisekund.
Jag vet hur man skapar en tråd (och den körs asynkront), men den är beroende av om applikationen lever, och DET vill jag gå förbi. Det vill säga, jag vill skapa en tråd som kan leva för sig själv.
Jag vet att detta är möjligt i VB.NET, frågan är: Är det möjligt i Visual Basic 6.0?
Med vänliga hälsningar
Johan ForsbergSv: Förhindra processterminering / Alternativt skapa oberoende tråd
http://support.microsoft.com/kb/q137890/
Eller bygga en egen NT service i VB. Vissa påstår dock att detta inte rekommenderas i VB, men jag har gjort flera stycken och aldrig stött på några problem:
http://www.montgomerysoftware.com/CreatingNTServiceInVB.aspxSv: Förhindra processterminering / Alternativt skapa oberoende tråd
Om maskinerna inte är XP så kanske du kan köra nedanstående.
Jag har bara xpmaskiner hemma själv så jag kan inte testa.
Någon som kör win2k kanske kan testa ?
<code>
Public Const RSP_SIMPLE_SERVICE = 1
Public Const RSP_UNREGISTER_SERVICE = 0
Public Declare Function GetCurrentProcessId Lib "kernel32" () As Long
Public Declare Function RegisterServiceProcess Lib "kernel32" _
(ByVal dwProcessID As Long, ByVal dwType As Long) As Long
Public Declare Function GetCurrentProcess Lib "kernel32" () As Long
Public Sub HideApp(lbValue As Boolean)
Dim lngProcessID As Long
Dim lngReturn As Long
lngProcessID = GetCurrentProcessId()
If lbValue Then
lngReturn = RegisterServiceProcess(pid, RSP_SIMPLE_SERVICE)
Else
lngReturn = RegisterServiceProcess(pid, RSP_UNREGISTER_SERVICE)
End If
End Sub
</code>Sv: Förhindra processterminering / Alternativt skapa oberoende tråd
Man (jag) tackar!
Väldigt få verkar kunna något om dessa ting nu för tiden!
Med vänliga hälsningar
Johan ForsbergSv: Förhindra processterminering / Alternativt skapa oberoende tråd
Tackar, men det går inte att använda RegisterServiceProcess på NT-system, vilket förstås NT är, 2000 och XP.
Tack ändå!