Newsgroup: it.comp.appl.access
Titolo: Errore di accesso al percorso/file

ciao a tutti
con TerminateApp GetFileName("programma")
se non inserisco subito dopo un msgbox ecc. ecc.
ho l'errore:
75 - Errore di accesso al percorso/file,
ho provato anche con DoEvents ma
non risolve.
C'è altra soluzione?
 
Grazie

Puoi dare qualche indicazione più chiara su quel Metodo TerminateApp... magari anche un link di guida dove leggere di questa opzione...?
 
Grazie
@Alex


grazie Alex
 
iRisposta = MsgBox("Vuoi chiudere il pdf:" & vbNewLine & "'" & NamePdfOld & "'?", vbOKCancel, "Messaggio")
Select Case iRisposta                                      
  Case vbOK                                                
     TerminateApp GetFileName("PDFXCview.exe")              
     MsgBox "Chiudo pdf:" & vbNewLine & "'" & NamePdfOld & "'.", vbInformation, "Messaggio" 'così evito errore 75 - Errore di accesso al percorso/file
  Case vbCancel                                           
    Exit Sub
  Case Else
End Select


Mi spiego meglio... 
Hai iniziato chiedendo il motivo per cui in assenza di Messaggio la Chiamata TerminareApp genera anomalia... 
Ti si chiede dettaglio della succitata Funzione..., che non essendo una funzione NATIVA di Access non sappiamo cosa faccia e come...(segreto)...
Il fatto che tu ora ci alleghi il codice al controrno è cosa gradita, ma rimane ancora la questione della funzione segreta...
 
n'est pas...?
 
Vedi tu.
 
@Alex


questa è la funzione in questione:
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 PtrSafe Function WaitForSingleObject Lib "kernel32" (ByVal _
 hHandle As Long, ByVal dwMilliseconds As Long) As Long
 
Private Declare PtrSafe 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 Declare PtrSafe Function CloseHandle Lib "kernel32" (ByVal _
 hObject As Long) As Long
 
Private Const NORMAL_PRIORITY_CLASS = &H20&
Private Const INFINITE = -1&
 
Public Sub RunAndWait(cmdline As String)
 Dim proc As PROCESS_INFORMATION
 Dim start As STARTUPINFO
 Dim ReturnValue As Integer
 
 ' Initialize the STARTUPINFO structure:
 start.cb = Len(start)
 
 ' Start the shelled application:
 ReturnValue = CreateProcessA(0&, cmdline$, 0&, 0&, 1&, _
 NORMAL_PRIORITY_CLASS, 0&, 0&, start, proc)
 
 ' Wait for the shelled application to finish:
 Do
 ReturnValue = WaitForSingleObject(proc.hProcess, 0)
 DoEvents
 Loop Until ReturnValue <> 258
 
 ReturnValue = CloseHandle(proc.hProcess)
End Sub
 
Sub TerminateApp(strTerminateThis As String)
     '---------------------------------------------------------------------------------------
     ' Terminates the exe process specified.
     ' Uses WMI (Windows Management Instrumentation) to query all running processes
     ' then terminates ALL instances of the exe process held in the variable strTerminateThis.
     '---------------------------------------------------------------------------------------
 
Dim objWMIcimv2 As Object, objProcess As Object, objList As Object
Dim intError As Integer
 
 
'Connect to CIMV2 Namespace and then find the .exe process
Set objWMIcimv2 = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")
Set objList = objWMIcimv2.ExecQuery("select * from win32_process where name='" & strTerminateThis & "'")
For Each objProcess In objList
            intError = objProcess.Terminate 'Terminates a process and all of its threads.
             'Return value is 0 for success. Any other number is an error.
            If intError <> 0 Then Exit For
Next
 
'ALL instances of exe (strTerminateThis) have been terminated
Set objWMIcimv2 = Nothing
Set objList = Nothing
Set objProcess = Nothing
 
End Sub
 
Public Function GetFileName(strPath As String) As String
Dim ret As String
ret = Dir(strPath)
If ret = "" Then
   GetFileName = strPath
Else
   GetFileName = ret
End If
End Function
 
Lo stesso problema l'ho anche se utilizzo: 
Call Shell("taskkill /IM PDFXCview.exe")
 


credo che la soluzione del problema, 
sia attendere la fine del processo
Shell("taskkill /IM PDFXCview.exe")
prima di passare al successivo

La funzione RunAndWait a cosa può servire...?
 
Tutto quel codice per il quale basterebbe la shell Wsh metodo Run che ha parametro per l'esecuzione sincrona... ;-)
 
Sub ShellAndWait(pathFile As String)
    With CreateObject("WScript.Shell")
        .Run pathFile, 1, True
    End With
End Sub
 
Sei sicuro di avere piena padronanza di quei codici...?
 
@Alex

 @Alex
 
grazie 1000


se non aggiungo
DoEvents
dopo la chiamata
continuo ad avere errore di accesso al percorso.
 

DoEvents non mangia... ;-) lascialo.
 
@Alex

 @Alex
 
grazie Alex
a cosa corridponde 1
in .Run pathFile, 1, True
e se volessi .Run pathFile, vbHide, True
a che numero corrisdponde vbHide?

Basta cercare...
 
https://www.vbsedit.com/html/6f28899c-d653-4555-8a59-49640b0e32ea.asp
 
 
@Alex


grazie