Artem_Butenko
Цитата:
К сожалению на хозяйстве имею только Windows XP, поэтому проверить работу скрипта на Windows 7 x64 просто не имею возможности. Похоже на Windows 7 x64 нужно видоизменить скрипт в части проверки, выполняется ли еще процес MyProgram.exe. Попробуйте еще [more=так]
Option Explicit
Dim fso, Origin, SourcePath, MyProgSourceExe, MyProgSourceIni, hstart, hstartDest, cmd32, SandboxParent, SandboxName, SandboxPath, MyProgDestExe, MyProgDestIni, cmd, id, ProcessName, ProcessNameFriend
Function OnLastProcessExit
Set fso = CreateObject("Scripting.FileSystemObject")
Origin = GetEnvironmentVariable("TS_ORIGIN")
SourcePath = Left(Origin, InStrRev(Origin, "\") - 1)
MyProgSourceExe = ExpandPath("%ProgramFilesDir%\Data\MyProgram.exe")
MyProgSourceIni = ExpandPath("%ProgramFilesDir%\Data\MyProgram.ini")
hstart = ExpandPath("%ProgramFilesDir%\Data\hstart.exe")
hstartDest = SourcePath & "\hstart.exe"
cmd32 = ExpandPath("%SystemSystem%\cmd.exe")
SandboxParent = GetBuildOption("SandboxPath")
SandboxName = GetBuildOption("SandboxName")
If SandboxParent = "." Then
SandboxPath = SourcePath & Chr(92) & SandboxName
Else
SandboxPath = SandboxParent & Chr(92) & SandboxName
End If
MyProgDestExe = SandboxPath & "\MyProgram.exe"
MyProgDestIni = SandboxPath & "\MyProgram.ini"
cmd = cmd32 & " /C " & chr(34) & MyProgDestExe & chr(34)
If not fso.FileExists(MyProgDestIni) then
fso.CopyFile MyProgSourceIni, MyProgDestIni
End If
If not fso.FileExists(MyProgDestExe) then
fso.CopyFile MyProgSourceExe, MyProgDestExe
End If
If not fso.FileExists(hstartDest) then
fso.CopyFile hstart, hstartDest
End If
id = ExecuteExternalProcess(hstartDest & " /NOCONSOLE " & chr(34) & cmd & chr(34))
ProcessName = "MyProgram.exe"
ProcessNameFriend = "MyProgram"
Do while isProcessRunning(ProcessName, ProcessNameFriend)
Loop
id = ExecuteExternalProcess(hstartDest & " /NOCONSOLE " & chr(34) & "taskkill /F /IM " & "Wmiprvse.exe" & chr(34))
WaitForProcess id, 0
If fso.FileExists(MyProgDestExe) Then
fso.DeleteFile(MyProgDestExe)
End if
If fso.FileExists(hstartDest) Then
fso.DeleteFile(hstartDest)
End if
End Function
Function isProcessRunning(ProcessName, ProcessNameFriend)
Dim objWMIService, Process
set objWMIService = GetObject ("winmgmts:")
isProcessRunning = False
For each Process in objWMIService.InstancesOf ("Win32_Process")
If StrComp(Process.Name,ProcessName,vbTextCompare) = 0 then
isProcessRunning = true
End If
Next
End Function[/more].
Вообще условие запуска MyProgram.exe из песочницу приводит к необходимости использовать стороннюю утилиту для запуска, вводить дополнительное условие ожидания завершения процесса MyProgram.exe и убивать процесс Wmiprvse.exe, который остается висеть в процессах после завершения работы.
Цитата:
Такая ошибка возникает на Windows 7 x64. На Windows XP x86 скрипт работает нормально.
К сожалению на хозяйстве имею только Windows XP, поэтому проверить работу скрипта на Windows 7 x64 просто не имею возможности. Похоже на Windows 7 x64 нужно видоизменить скрипт в части проверки, выполняется ли еще процес MyProgram.exe. Попробуйте еще [more=так]
Option Explicit
Dim fso, Origin, SourcePath, MyProgSourceExe, MyProgSourceIni, hstart, hstartDest, cmd32, SandboxParent, SandboxName, SandboxPath, MyProgDestExe, MyProgDestIni, cmd, id, ProcessName, ProcessNameFriend
Function OnLastProcessExit
Set fso = CreateObject("Scripting.FileSystemObject")
Origin = GetEnvironmentVariable("TS_ORIGIN")
SourcePath = Left(Origin, InStrRev(Origin, "\") - 1)
MyProgSourceExe = ExpandPath("%ProgramFilesDir%\Data\MyProgram.exe")
MyProgSourceIni = ExpandPath("%ProgramFilesDir%\Data\MyProgram.ini")
hstart = ExpandPath("%ProgramFilesDir%\Data\hstart.exe")
hstartDest = SourcePath & "\hstart.exe"
cmd32 = ExpandPath("%SystemSystem%\cmd.exe")
SandboxParent = GetBuildOption("SandboxPath")
SandboxName = GetBuildOption("SandboxName")
If SandboxParent = "." Then
SandboxPath = SourcePath & Chr(92) & SandboxName
Else
SandboxPath = SandboxParent & Chr(92) & SandboxName
End If
MyProgDestExe = SandboxPath & "\MyProgram.exe"
MyProgDestIni = SandboxPath & "\MyProgram.ini"
cmd = cmd32 & " /C " & chr(34) & MyProgDestExe & chr(34)
If not fso.FileExists(MyProgDestIni) then
fso.CopyFile MyProgSourceIni, MyProgDestIni
End If
If not fso.FileExists(MyProgDestExe) then
fso.CopyFile MyProgSourceExe, MyProgDestExe
End If
If not fso.FileExists(hstartDest) then
fso.CopyFile hstart, hstartDest
End If
id = ExecuteExternalProcess(hstartDest & " /NOCONSOLE " & chr(34) & cmd & chr(34))
ProcessName = "MyProgram.exe"
ProcessNameFriend = "MyProgram"
Do while isProcessRunning(ProcessName, ProcessNameFriend)
Loop
id = ExecuteExternalProcess(hstartDest & " /NOCONSOLE " & chr(34) & "taskkill /F /IM " & "Wmiprvse.exe" & chr(34))
WaitForProcess id, 0
If fso.FileExists(MyProgDestExe) Then
fso.DeleteFile(MyProgDestExe)
End if
If fso.FileExists(hstartDest) Then
fso.DeleteFile(hstartDest)
End if
End Function
Function isProcessRunning(ProcessName, ProcessNameFriend)
Dim objWMIService, Process
set objWMIService = GetObject ("winmgmts:")
isProcessRunning = False
For each Process in objWMIService.InstancesOf ("Win32_Process")
If StrComp(Process.Name,ProcessName,vbTextCompare) = 0 then
isProcessRunning = true
End If
Next
End Function[/more].
Вообще условие запуска MyProgram.exe из песочницу приводит к необходимости использовать стороннюю утилиту для запуска, вводить дополнительное условие ожидания завершения процесса MyProgram.exe и убивать процесс Wmiprvse.exe, который остается висеть в процессах после завершения работы.