OVH Cloud OVH Cloud

Problème avec MoveFileEx

15 réponses
Avatar
Assi
Bonjour,

J'essaie de d=E9placer un fichier avec l'API MoveFileEx, =E0=20
l'ex=E9cution, j'obtient un code erreur suivant: 123, Erreur=20
d=E9finie par l'application ou par l'objet.
Cela ne marche pas car MoveFileEx renvoie toujours 0, donc=20
=E9choue

Est-ce un probl=E8me de droit?

Si quelqu'un a une id=E9e, je le remecie beaucoup
Ci-dessous le squelette du code

D'avance merci

Assi

Private Sub CopyTempFile(sSource As String, sDestination=20
As String)
Dim fso As FileSystemObject, sPath$, oFolder As=20
IWshRuntimeLibrary.Folder
Dim lRet As Long
On Error GoTo CopyFileError
Set fso =3D CreateObject("Scripting.FileSystemObject")
Set oFolder =3D fso.CreateFolder("c:\Temporary")
sPath =3D oFolder.Path
If Right$(sPath, 1) <> "\" Then sPath =3D sPath & "\"
'Call fso.CopyFile(sSource, sPath, True)
lRet =3D MoveFileEx(sSource, sPath, _=20
MOVEFILE_REPLACE_EXISTING Or MOVEFILE_DELAY_UNTIL_REBOOT)
If lRet =3D 0 Then
Err.Raise Err.LastDllError
End If
ExitSub:
Set fso =3D Nothing
Set oFolder =3D Nothing
Exit Sub
CopyFileError:
If Err.Number =3D 58 Then
fso.DeleteFolder "C:\Temporary"
Resume
Else
MsgBox Err & ": " & Err.Description
GoTo ExitSub
End If
End Sub

Noter que sSource est du type '\\ServName\Dossier\Dossier2
\Fichier'

10 réponses

1 2
Avatar
ng
Salut,

NE PAS UTILISER LE FSO EN VB ==>
http://faq.vb.free.fr/index.php?question6

Il eciste des commandes VB implantées pour le système de fichier et les
APIs...

fso.CreateFolder("c:Temporary")


MkDir

fso.CopyFile


FileCopy


fso.DeleteFolder


RmDir

Et même encore Kill, Open, Name...

--
Nicolas G.
FAQ VB : http://faq.vb.free.fr
API Guide : http://www.allapi.net
Google Groups : http://groups.google.fr/
MZ-Tools : http://www.mztools.com/

Assi wrote:
Bonjour,

J'essaie de déplacer un fichier avec l'API MoveFileEx, à
l'exécution, j'obtient un code erreur suivant: 123, Erreur
définie par l'application ou par l'objet.
Cela ne marche pas car MoveFileEx renvoie toujours 0, donc
échoue

Est-ce un problème de droit?

Si quelqu'un a une idée, je le remecie beaucoup
Ci-dessous le squelette du code

D'avance merci

Assi

Private Sub CopyTempFile(sSource As String, sDestination
As String)
Dim fso As FileSystemObject, sPath$, oFolder As
IWshRuntimeLibrary.Folder
Dim lRet As Long
On Error GoTo CopyFileError
Set fso = CreateObject("Scripting.FileSystemObject")
Set oFolder = fso.CreateFolder("c:Temporary")
sPath = oFolder.Path
If Right$(sPath, 1) <> "" Then sPath = sPath & ""
'Call fso.CopyFile(sSource, sPath, True)
lRet = MoveFileEx(sSource, sPath, _
MOVEFILE_REPLACE_EXISTING Or MOVEFILE_DELAY_UNTIL_REBOOT)
If lRet = 0 Then
Err.Raise Err.LastDllError
End If
ExitSub:
Set fso = Nothing
Set oFolder = Nothing
Exit Sub
CopyFileError:
If Err.Number = 58 Then
fso.DeleteFolder "C:Temporary"
Resume
Else
MsgBox Err & ": " & Err.Description
GoTo ExitSub
End If
End Sub

Noter que sSource est du type 'ServNameDossierDossier2
Fichier'


Avatar
scraper
Dans son message e8b$,

ng nous a écrit/ répondu :


Salut,

NE PAS UTILISER LE FSO EN VB ==>
http://faq.vb.free.fr/index.php?question6


Et même encore Kill, Open, Name...



salut !

oui ....

je rebondis ....

et pour exécuter une dll en tant qu'application ?

(ex pour exécuter un fichier inf ;-)

en temps normal, on fait CreateObject("Wscript.Shell").Run _
"rundll32.exe setupapi,InstallHinfSection DefaultInstall _
132 C:Toto.inf"

mais avec les API ??

j'ai essayer de bidouiller ShellExecute .... sans succès ??!

merci .... et désolé de m'imiscer ....



--

Attention ! Adresse mail invalide ...
Pour me contacter, cliquez sur le lien ci-dessous:
http://scraper.chez.tiscali.fr/contact.htm

scraper
Avatar
Zoury
Salut Assi! :O)


J'essaie de déplacer un fichier avec l'API MoveFileEx, à
l'exécution, j'obtient un code erreur suivant: 123, Erreur
définie par l'application ou par l'objet.
Cela ne marche pas car MoveFileEx renvoie toujours 0, donc
échoue



Comment peux-tu savoir que MoveFileEx te renvoit 0 si tu obtiens une erreur
123?

où survient l'erreur 123? (ce sont deux problèmes distincts on dirait..)




si tu veux savoir pourquoi l'API ne fonctionne pas, utilise la fonction
ci-bas (désolé pour les longues lignes):
'***
' déclarations nécessaire à la fonction
Private Const FORMAT_MESSAGE_IGNORE_INSERTS As Long = &H200&
Private Const FORMAT_MESSAGE_FROM_SYSTEM As Long = &H1000&
Private Const LANG_NEUTRAL As Long = &H0&

Private Declare Function FormatMessageA _
Lib "kernel32" _
( _
ByVal dwFlags As Long, _
ByRef lpSource As Any, _
ByVal dwMessageId As Long, _
ByVal dwLanguageId As Long, _
ByVal lpBuffer As String, _
ByVal nSize As Long, _
ByRef Arguments As Long _
) As Long


' fonction
Public Function FormatMessage(ByRef lErrorNumber As Long) As String
FormatMessage = Space$(255)
Call FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM, ByVal 0&, lErrorNumber,
LANG_NEUTRAL, FormatMessage, 255, ByVal 0&)
FormatMessage = Left$(FormatMessage, InStr(FormatMessage, vbNewLine) -
1)
End Function
'***

tu l'utilise comme suit :
'***
' si égal 0 il y a eu une erreur
If (MoveFileEx(sExistingFile, sNewFile, MY_FLAGS) = 0) Then
' on affiche l'erreur
Debug.Print FormatMessage(Err.LastDllError)
End If
'***

tu devrais connaître la cause de l'échec assez rapidement.. (ça fonctionne
pour tous les APIs qui renvoit le numéro de l'erreur système)


--
Cordialement
Yanick Lefebvre - MVP pour Visual Basic
http://faq.vb.free.fr/?rubrique=0 - http://www.mvps.org/vbnet/
http://www.mentalis.org/agnet/apiguide.shtml - http://www.mztools.com/

Merci de poster les réponses au groupe afin d'en faire profiter à tous
Avatar
François Picalausa
Bonjour/soir,

Tu peux essayer la même chose avec Shell (de VB)
Sinon, avec shell execute, vois si tu ne peux pas passer le chemin complet
de l'inf (lpfile - 3ème paramètre) et comme "verb" (le deuxième paramètre
qui prend par exemple open, print, ...) "Install" (repris de la base de
registre)

Les verbs peuvent être retrouvés dans la base de registre dans les clés
suivantes:
HK_CL_ROOT
|-.ext/appid
|-shell
|-verb1
|-verb2
...

--
François Picalausa (MVP VB)
FAQ VB : http://faq.vb.free.fr
MSDN : http://msdn.microsoft.com


"scraper" a écrit dans le message de
news:
et pour exécuter une dll en tant qu'application ?
en temps normal, on fait CreateObject("Wscript.Shell").Run _
"rundll32.exe setupapi,InstallHinfSection DefaultInstall _
132 C:Toto.inf"

j'ai essayer de bidouiller ShellExecute .... sans succès ??!


Avatar
scraper
Dans son message ,

François Picalausa nous a écrit/ répondu :


Bonjour/soir,

Tu peux essayer la même chose avec Shell (de VB)
Sinon, avec shell execute, vois si tu ne peux pas passer le chemin
complet de l'inf (lpfile - 3ème paramètre) et comme "verb" (le
deuxième paramètre qui prend par exemple open, print, ...) "Install"
(repris de la base de registre)

Les verbs peuvent être retrouvés dans la base de registre dans les
clés suivantes:
HK_CL_ROOT
|-.ext/appid
|-shell
|-verb1
|-verb2



salut !

d'acc, merci, j'essaie ça ... ;-)

à +
...




--

Attention ! Adresse mail invalide ...
Pour me contacter, cliquez sur le lien ci-dessous:
http://scraper.chez.tiscali.fr/contact.htm

scraper
Avatar
scraper
Dans son message ,

François Picalausa nous a écrit/ répondu :


Bonjour/soir,



Re !

Les verbs peuvent être retrouvés dans la base de registre dans les
clés suivantes:
HK_CL_ROOT
|-.ext/appid
|-shell
|-verb1
|-verb2



je trouve pas de ".ext/ ...etc...." dans mon HK_Classe_Root ??
...



--

Attention ! Adresse mail invalide ...
Pour me contacter, cliquez sur le lien ci-dessous:
http://scraper.chez.tiscali.fr/contact.htm

scraper
Avatar
François Picalausa
Bonjour/Soir,

HK_CL_ROOT
|-.ext/appid
|-shell
|-verb1
|-verb2



je trouve pas de ".ext/ ...etc...." dans mon HK_Classe_Root ??



.ext représente une extension quelconque
appid est une appid quelconque ;-)

Par exemple, on pourrait avoir
HK_CR > .txt > Shell > les verbs
Ou
HK_CR > .inf > (default)=inffile
HKCR > infile > Shell > les verbs

Dans le second cas, "inffile" est un appid

--
François Picalausa (MVP VB)
FAQ VB : http://faq.vb.free.fr
MSDN : http://msdn.microsoft.com


"scraper" a écrit dans le message de
news:
Dans son message ,

François Picalausa nous a écrit/ répondu :


Bonjour/soir,



Re !

Les verbs peuvent être retrouvés dans la base de registre dans les
clés suivantes:




Avatar
Assi
Bonjour Yanick,

Merci pour le tuyau, car cela m'a permit de savoir la
cause de l'erreur qui est la suivante:
'123: Syntaxe du nom de fichier, de repertoire ou de
volume incorrecte.'
Mais ce que je comprends pas c'est que sFileSource est du
type 'ServeurDossierFile.exe', sFileDestination est en
local sous forme 'C:Temporary'.
Est-ce parce qu'il s'agit d'un chemin UNC?
D'avance merci.
Assi

-----Message d'origine-----
Salut Assi! :O)


J'essaie de déplacer un fichier avec l'API MoveFileEx, à
l'exécution, j'obtient un code erreur suivant: 123,




Erreur
définie par l'application ou par l'objet.
Cela ne marche pas car MoveFileEx renvoie toujours 0,




donc
échoue



Comment peux-tu savoir que MoveFileEx te renvoit 0 si tu


obtiens une erreur
123?

où survient l'erreur 123? (ce sont deux problèmes


distincts on dirait..)




si tu veux savoir pourquoi l'API ne fonctionne pas,


utilise la fonction
ci-bas (désolé pour les longues lignes):
'***
' déclarations nécessaire à la fonction
Private Const FORMAT_MESSAGE_IGNORE_INSERTS As Long =


&H200&
Private Const FORMAT_MESSAGE_FROM_SYSTEM As Long = &H1000&
Private Const LANG_NEUTRAL As Long = &H0&

Private Declare Function FormatMessageA _
Lib "kernel32" _
( _
ByVal dwFlags As Long, _
ByRef lpSource As Any, _
ByVal dwMessageId As Long, _
ByVal dwLanguageId As Long, _
ByVal lpBuffer As String, _
ByVal nSize As Long, _
ByRef Arguments As Long _
) As Long


' fonction
Public Function FormatMessage(ByRef lErrorNumber As Long)


As String
FormatMessage = Space$(255)
Call FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM, ByVal


0&, lErrorNumber,
LANG_NEUTRAL, FormatMessage, 255, ByVal 0&)
FormatMessage = Left$(FormatMessage, InStr


(FormatMessage, vbNewLine) -
1)
End Function
'***

tu l'utilise comme suit :
'***
' si égal 0 il y a eu une erreur
If (MoveFileEx(sExistingFile, sNewFile, MY_FLAGS) =


0) Then
' on affiche l'erreur
Debug.Print FormatMessage(Err.LastDllError)
End If
'***

tu devrais connaître la cause de l'échec assez


rapidement.. (ça fonctionne
pour tous les APIs qui renvoit le numéro de l'erreur


système)


--
Cordialement
Yanick Lefebvre - MVP pour Visual Basic
http://faq.vb.free.fr/?rubrique=0 -


http://www.mvps.org/vbnet/
http://www.mentalis.org/agnet/apiguide.shtml -


http://www.mztools.com/

Merci de poster les réponses au groupe afin d'en faire


profiter à tous


.



Avatar
ng
Salut,
Il ne s'agt pas d'une dll mais d'un exe : rundll32.exe.

Utilise Shell ou l'API ShellExecute.

--
Nicolas G.
FAQ VB : http://faq.vb.free.fr
API Guide : http://www.allapi.net
Google Groups : http://groups.google.fr/
MZ-Tools : http://www.mztools.com/

scraper wrote:
Dans son message e8b$,

ng nous a écrit/ répondu :


Salut,

NE PAS UTILISER LE FSO EN VB ==>
http://faq.vb.free.fr/index.php?question6


Et même encore Kill, Open, Name...



salut !

oui ....

je rebondis ....

et pour exécuter une dll en tant qu'application ?

(ex pour exécuter un fichier inf ;-)

en temps normal, on fait CreateObject("Wscript.Shell").Run _
"rundll32.exe setupapi,InstallHinfSection DefaultInstall _
132 C:Toto.inf"

mais avec les API ??

j'ai essayer de bidouiller ShellExecute .... sans succès ??!

merci .... et désolé de m'imiscer ....


Avatar
scraper
Dans son message %,

François Picalausa nous a écrit/ répondu :


.ext représente une extension quelconque
appid est une appid quelconque ;-)

Par exemple, on pourrait avoir
HK_CR > .txt > Shell > les verbs
Ou
HK_CR > .inf > (default)=inffile
HKCR > infile > Shell > les verbs

Dans le second cas, "inffile" est un appid



re !

oups !

j'me sens con, là .... j'avais pas compris ça comme ça !

je pensais que .ext était une entrée du Registre qui listait les actions possibles en VB avec ShellExecute ! lol

faut que j'aille me reposer, moi .... :-)

sinon, j'ai trouvé ça, dans API-Guide :
----
· lpOperation
Pointer to a null-terminated string that specifies the operation to perform. The following operation strings are valid:
"open"
The function opens the file specified by lpFile. The file can be an executable file or a document file. The file can be a folder to
open.
"print"
The function prints the file specified by lpFile. The file should be a document file. If the file is an executable file, the
function opens the file, as if "open" had been specified.
"explore"
The function explores the folder specified by lpFile.

The lpOperation parameter can be NULL. In that case, the function opens the file specified by lpFile.
------

il semble que seuls ces paramètres soient dispo ?

je vais quand même jeter un oeil au Registre , merci !








si tu veux bien, en outre, me donner quelques précisions complémentaires, SVP, sur l'emploi du Shell de VB ??

en VBS, j'arrivais par exemple à faire pauser l'exécution de la méthode .run du Shell (Shell.Run "mon appli",1, True ) ....

comment faire de même en VB ??

(en d'autres termes, comment faire une exécution synchrone ?)

Comment intercepter les erreurs générées durant l'exécution de Shell ?
(jai essayé avec On Error Resume Next : If err then ..... mais ça joue pas ?)

encore un grand merci à toi ...



--

Attention ! Adresse mail invalide ...
Pour me contacter, cliquez sur le lien ci-dessous:
http://scraper.chez.tiscali.fr/contact.htm

scraper
1 2