En mi rpograma tilizo la función shell para ejecutar comandos de msdos, la mayoría de los que he probado funcionan perfectamente excepto el copy.
Si pongo:
Shell "copy C:\Untitled.wmv J:\"
Me da error 53, no se ha encontrado el archivo, pero el archivo está, porque si pongo el mismo comando en la línea de comandos de windows sí que me lo hace.
He visto que el vb tiene una función propia para la copia de archivos pero es mucho más lenta. ¿Alguien sabe por qué no me funciona?
Gracias
Prueba utilizando el
FileCopy
Otra opción:
Shell "cmd.exe /C copy C:\Untitled.wmv J:\"
Un Saludo. ;)
CitarPrueba utilizando el
FileCopy
CitarHe visto que el vb tiene una función propia para la copia de archivos pero es mucho más lenta
Con ésto me refería a esa función.
Hendrix, lo que me has dicho funciona a la perfección GRACIAS!!
Ahora se me plantea otra duda. Si pongo:
Shell "cmd.exe /C copy C:\Untitled.wmv J:\"
MsgBox "Hola"
Antes de que se termine de copiar el archivo se ejecuta la siguiente instrucción, ¿hay algún modo de hacer que se espere?
Con la API WaitForSingleObject puedes esperar a que se cierre la aplicación. ;)
Para usarla haz esto:
dim Ho as long
Ho = sell ("cmd.exe /C copy C:\Untitled.wmv J:\")
waitforsingleobject (ho, Infinite)
Mira este ejemplo: http://support.microsoft.com/kb/551122/es
Un Saudo. ;)
He declarado:
Private Declare Function Waitforsingleobject Lib "kernel32" Alias _
"WaitForSingleObject" (ByVal hHandle As Long, _
ByVal dwMilliseconds As Long) As Long
Y en el código he puesto:
Dim Ho As Long
Ho = Shell("cmd.exe /C copy C:\Untitled.wmv J:\")
ret = Waitforsingleobject(Ho, Infinite)
El problema es que no se espera, ¿puede ser porque la función shell no devueñve el identificardor que necesita Waitforsingleobject?, ¿alguna solución?
Citar¿puede ser porque la función shell no devueñve el identificardor que necesita Waitforsingleobject?
NO, porque he comprobado que la variable Ho, recibe un número.
Muchas gracias!!!!
shell te devuelve el id del proceso y waitforsingleobject necesita el handle del proceso.
¿Cómo obtengo el handle a partir de la id? ¿O de qué otra manera podría hacerlo?
openprocess
:-\ un poquito más explícito ayudaría. Buscaré información a ver que saco con eso. Gracias
The OpenProcess function returns a handle of an existing process object.
HANDLE OpenProcess(
DWORD dwDesiredAccess, // access flag
BOOL bInheritHandle, // handle inheritance flag
DWORD dwProcessId // process identifier
);