Jag försöker att tabort en fil efter det att den har packats upp. Du kan inte använda Sleep då sover hela programmet , inget händer Tackar det ser ut som det ska funka. Ska hem och testa det i kväll. Jag har testat det nu och det funkar inte. När jag tänker efter så kommer lngProcId aldrig att ändra värde. Men det borde finnas någon function som kollar om lngProcId är igång. Jag fixat en lösning nu men jag tycker fortfarande att det borde finnas enklare lösningar. Så jag kommer inte att markera den som löst. Det känndes inte riktigt bra så jag sökte lite mer i "api-guiden" och hittade något jag är nöjd med. Om du bortser från Do Loopen Fråga , Packade Shell upp rar filen ? Ja shell packade upp filerna. Fördelen med att fånga felmeddelandet är att programmet nödvändigtsvis inte måste hänga sig under uppackninge! ;) Du har rätt att den lösningen fryser programmet. Men resten av system funkar (iallafall i win2000 ;)). Men jag ska köra det vid programstart så programmet syns inte under tiden eller möjligtvis lägger jag en splash bild så det spelar mindre roll att det blir så.tabort en fil efter den har packats upp.
Jag har tänkte lite och så här borde det gå att göra men jag har inte tillräkligt med kunskap att få det att funka.
<code>
Dim lngHandle as long
'kom inte ihåg exakt hur denna rad såg ut men spelar mindre roll
lngHandle = ShelExecute (me.hwnd, app.path & "\rar.exe" , "x -o+ " & app.path & "\filer.rar", "något??" , SW_HIDE
Do
'sleep(5000) eller doevents eller vad som är bäst att använda???
' här vill jag kolla om lnghandle är fortfarande aktiv om den inte är det så ska filen filer.rar tas bort
'En annan lösning som jag tror går att göra är att kolla om att kill filer.rar funkar att utföra och då avsluta loopen
loop while(något)
</code>
eller det kanske finns någon helt annan lösning?Sv: tabort en fil efter den har packats upp.
Shell lämnar ProcessId inte Handle , spelar ingen roll men ändå.
Dim lngProcId As Long
lngProcId = 0 'försäkra att lngProcId verligen är 0 (nolll) när du börjar
'kör ditt
lngProcId = Shell(App.Path & "\rar.exe x -o+ " & App.Path & "\filen.rar", vbHide)
Do Until lngProcId <> 0
DoEvents
Loop
Kill App.Path & "\filen.rar"Sv: tabort en fil efter den har packats upp.
Sv: tabort en fil efter den har packats upp.
shellexecute och shell verkar returnera olika sort värden(handle?, pid?). Men jag vet inte vilket av värdena som lättast går att kolla om de är aktiva??
Jag har kollat bland api kommandona och jag tror kanske jag kan sy ihop en lösning.
Jag har en funktion som kan omvandla shell returvärdet till ett längre värde (vet inte vad det kallas?). Och jag har en annan funktion(använder bla enumwindows) som verkar gå igenom alla processer (med samma sorts värden som jag fick från första funktionen) som är igång.
Men den lösningen känns det som jag överarbetar det? Men om ingen annan kan komma med en bättre lösning så får jag testa få ihop den.Sv: tabort en fil efter den har packats upp.
Private Sub Command1_Click()
Dim lngPid As Long, i&
lngPid = 0
lngPid = Shell(App.Path & "\rar.exe x -o+ " & App.Path & "\mer2.rar " & App.Path & "\nya_filer\", vbHide)
'detta gör jag för att "mwnd = instan..." raden ska funka
For i = 0 To 15
DoEvents
Next
mWnd = InstanceToWnd(lngPid)
Do
lngKlar = 1
EnumWindows AddressOf EnumWindowsProc, ByVal 0&
DoEvents
Loop Until (lngKlar = 1)
Kill App.Path & "\mer2.rar"
End Sub
'Modulen ser ut så här
Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As Long, lpdwProcessId As Long) As Long
Private Declare Function GetWindow Lib "user32" (ByVal hwnd As Long, ByVal wCmd As Long) As Long
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As Long, ByVal lpWindowName As Long) As Long
Private Declare Function GetParent Lib "user32" (ByVal hwnd As Long) As Long
Public Declare Function EnumWindows Lib "user32" (ByVal lpEnumFunc As Long, ByVal lParam As Long) As Boolean
Const GW_HWNDNEXT = 2
Public mWnd As Long
Public lngKlar As Long
Function InstanceToWnd(ByVal target_pid As Long) As Long
Dim test_hwnd As Long, test_pid As Long, test_thread_id As Long
'Find the first window
test_hwnd = FindWindow(ByVal 0&, ByVal 0&)
Do While test_hwnd <> 0
'Check if the window isn't a child
If GetParent(test_hwnd) = 0 Then
'Get the window's thread
test_thread_id = GetWindowThreadProcessId(test_hwnd, test_pid)
If test_pid = target_pid Then
InstanceToWnd = test_hwnd
Exit Do
End If
End If
'retrieve the next window
test_hwnd = GetWindow(test_hwnd, GW_HWNDNEXT)
Loop
End Function
Public Function EnumWindowsProc(ByVal hwnd As Long, ByVal lParam As Long) As Boolean
If Str$(hwnd) = mWnd Then
lngKlar = 0
' EnumWindowsProc = False
' Exit Function
End If
'continue enumeration
EnumWindowsProc = True
End FunctionSv: tabort en fil efter den har packats upp.
Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
Private Declare Function OpenProcess Lib "Kernel32.dll" (ByVal dwDesiredAccessas As Long, ByVal bInheritHandle As Long, ByVal dwProcId As Long) As Long
Const SYNCHRONIZE = &H100000
Const INFINITE = &HFFFF
Private Sub Form_Load()
Dim strStr$
strStr = App.Path & "\rar.exe" & " x -o+ """ & App.Path & "\" & f1.Name & """ """ & App.Path & "\nya_filer\"""
WaitForSingleObject OpenProcess(SYNCHRONIZE, 0, Shell(strStr, vbHide)), INFINITE
Kill App.Path & "\" & f1.name
End SubSv: tabort en fil efter den har packats upp.
I så fall kunde du köra en Do Loop som testade FileExists på den uppackade filen.Sv: tabort en fil efter den har packats upp.
Men jag kan inte kör fileexists för att det kommer att vara olika filer som ska behandlas.
Men det borde funka med att fånga upp felmedelande från kill filen.rar och när det inte blev felmedelande gå vidare. Men jag känner mig nöjd med lösningen ovan.Sv: tabort en fil efter den har packats upp.
Sv: tabort en fil efter den har packats upp.
Och så måste jag nog säga att det går att använda fileexists. Jag tänkte att man skulle använda det på filerna man packat upp när jag svarade.
Men man kan säkert använda det på filen man ska tabort. Om har med raden 'on error resume next'.