IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

WinDev Discussion :

Fonction api CopyFileExA blocage


Sujet :

WinDev

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    96
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Côte d'Or (Bourgogne)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 96
    Points : 104
    Points
    104
    Par défaut Fonction api CopyFileExA blocage
    Bonjour à tous,

    J'ai un problème avec la fonction de l'api windows CopyFileExA.
    Je constate un plantage complet du système très aléatoire et uniquement sur Windows serveur 2008.

    Pour les tests, j'ai fait une boucle qui :
    - Liste les répertoires à copie
    - Traite la liste de Copie
    - Supprime tous les répertoires du disque de sauvegarde
    =>Boule.

    Les fichiers copié sont de taille variable de quelque Ko à 500 - 600 Mo.

    Aucun événement système n'est enregistré.
    Aucune Exception Wlangage est générée.
    J'ai tracé toutes les lignes de code du programme pour identifier qu'il ne ressort pas de API.

    J'ai testé avec ou sans la procédure CallBack, toujours plantage.

    je suis vraiment à cour d'idée!

    Je vous mets le code de Traitement de la copie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
     
    PROCEDURE PRIVÉE Local_CopieFichier(cpSource est une chaîne,cpDestination est une chaîne,epTaille est un entier sur 8 octets)
     
    LOCAL
    	dpDateSource est une DateHeure
    	dpdateDest est une DateHeure
    	dpdateDestPlusSec est une DateHeure
    	dpdateDestMoinsSec est une DateHeure
    	//Copie
    	bpCopie est un booléen
    	cpEtoile est une chaîne = Répète("#",5)
    	CopyFileExA est une Description d'API
    	dpDuréeAPI est une Durée
     
     
    oRapport:TraceExecution("CopieFichier",cpEtoile+"fDateHeure")
    dpDateSource = fDateHeure(cpSource,"",fModification)
    SI dpDateSource = "" ALORS
    	oRapport:Suivit(ErreurInfo(errMessage)) 
    	RENVOYER(-1)
    FIN
    ogpApplication:LocalDestinationEnCours = cpDestination
    ogpApplication:LocalSourceEnCours = cpSource 
    ogpApplication:LocalTailleEnCours = epTaille
     
    SI :bComparaisonDateModification _ET_ fFichierExiste(cpDestination)  ALORS
    	dpdateDest = fDateHeure(cpDestination,"",fModification)
    	dpdateDestPlusSec = dpdateDest
    	dpdateDestMoinsSec= dpdateDest
    	dpdateDestPlusSec..Seconde++
    	dpdateDestPlusSec..Seconde++
    	dpdateDestMoinsSec..Seconde--
    	dpdateDestMoinsSec..Seconde--
    	SI dpDateSource = dpdateDest  OU (dpDateSource >= dpdateDestMoinsSec ET dpDateSource <= dpdateDestPlusSec ) ALORS 
    		:eTailleEnCours += epTaille
    		eNbFichierRestant--
    		SysIconeModifie(ICONE_ORTHOSAVE,"Sauvegarde en cours..... ("+ NumériqueVersChaîne(((:eNbFichier-:eNbFichierRestant)*100/:eNbFichier),"03.1f")+"%)")
    		pProgression(:eNbFichier-:eNbFichierRestant)
    		Multitâche()
    		RENVOYER(0)
    	FIN
    FIN
     
     
    oRapport:TraceExecution("CopieFichier",cpEtoile+"Début Copie")
     
    CopyFileExA..NomDLL = "kernel32"
    CopyFileExA..NomFonction = "CopyFileExA"
    CopyFileExA..TypeRetour = apiBooléen
    CopyFileExA..Paramètre[1]..Type = apiEntierSystème
    CopyFileExA..Paramètre[2]..Type = apiEntierSystème
    CopyFileExA..Paramètre[3]..Type = apiEntierSystème
    CopyFileExA..Paramètre[4]..Type = apiEntierSystème
    CopyFileExA..Paramètre[5]..Type = apiEntierSystème
    CopyFileExA..Paramètre[6]..Type = apiEntierSystème
    APIParamètre(apiDéchargeDLL,Faux)
    APIParamètre(apiRestaureParamètresSystème,Faux)
     
     
    //Résultat booléen = AppelDLL32("KERNEL32","CopyFileExA",Fichier source,fichier destination,&procédure coolback,&Data à transférer à la coolback,Indicateur de cancel,flag de copie)
    //bpCopie = AppelDLL32("KERNEL32","CopyFileExA",&cpsource,&cpDestination,null,null,null,0x00001000) //COPY_FILE_NO_BUFFERING
    ChronoDébut(100)
    bpCopie = CopyFileExA(&cpSource,&cpDestination,&CopyProgressCallBack,Null,Null,0x00001000)
    dpDuréeAPI = ChronoFin(100)
     
    ChronoDébut(100)
    bpCopie = Local_CopieSystemIO(cpSource,cpDestination,epTaille)
    dpDuréeNET = ChronoFin(100)
    Info("API: "+dpDuréeAPI,"NET : "+dpDuréeNET)
    SI bpCopie ALORS fDateHeure(cpDestination,dpDateSource,fModification)
     
    oRapport:TraceExecution("CopieFichier",cpEtoile+"Sortie Copie : "+bpCopie)
     
    Multitâche()
     
    :eTailleEnCours += epTaille
    eNbFichierRestant--
     
     
    SysIconeModifie(ICONE_ORTHOSAVE,"Sauvegarde en cours..... ("+ NumériqueVersChaîne(((:eNbFichier-:eNbFichierRestant)*100/:eNbFichier),"03.1f")+"%)")
    pProgression(:eNbFichier-:eNbFichierRestant)
     
     
    SI PAS bpCopie ALORS
    	RENVOYER(-1)
    SINON
    	RENVOYER(0)	
    FIN
    Petite présision, je fait des tests avec .NET pour trouvé une autre solution au cas ou!
    la fonction

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ChronoDébut(100)
    bpCopie = Local_CopieSystemIO(cpSource,cpDestination,epTaille)
    dpDuréeNET = ChronoFin(100)
    me permet de comparé les performances.

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    96
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Côte d'Or (Bourgogne)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 96
    Points : 104
    Points
    104
    Par défaut
    J'ai tester avec les fonctions api CopyFileTransacted() de Kernel32, j'ai toujours des problème de blocage du serveur.
    l'activité du processeur passe à 0% et le bureau du pc est complètement planté.
    pas de saturation de la mémoire à ce moment la.

    Je suis complétement dans l'impasse

  3. #3
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2004
    Messages
    2 347
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 347
    Points : 3 868
    Points
    3 868
    Par défaut
    Salut à toi,

    Désolé de poser la question mais pourquoi passes-tu par cette API, au lieu d'utiliser les fonctions de copie de Windev ?

    Je n'ai pas eu le courage de détailler ton code, donc encore désolé si la réponse à ma question s'y trouve.

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    96
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Côte d'Or (Bourgogne)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 96
    Points : 104
    Points
    104
    Par défaut
    pour une simple question d'affichage de progression de copie par fichier.
    a force de test, il s'avère que mon code fonctionne très bien sans IHM par un service.
    le serveur plante également en utilisant super copier.
    je pence à un problème de carte graphique ou autre problème système.

    Merci en tous cas de ta réponse.

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Août 2008
    Messages
    256
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 256
    Points : 85
    Points
    85
    Par défaut
    Bonsoir Taakar !

    Je souhaiterai tester ton code car je suis assez intéressé par l'API que tu utilises.
    Je suis entrain de développer un programme de backup, j’utilise la fonction de Windev fcopiefichier() qui ne me donne pas une entière satisfaction.

    J'ai copié ton code mais il me manque certaines classes donc je ne peux pas le tester.

    Je te remercie d'avance pour ton aide.

    Jb_One73

Discussions similaires

  1. Connaitre le processus qui appelle une fonction API
    Par RazielReaver dans le forum API, COM et SDKs
    Réponses: 9
    Dernier message: 28/05/2006, 13h56
  2. MASM et XP : fonctions API inconnues
    Par naplot dans le forum x86 32-bits / 64-bits
    Réponses: 1
    Dernier message: 27/03/2006, 03h41
  3. Fonction API
    Par margilb dans le forum C++Builder
    Réponses: 2
    Dernier message: 08/07/2002, 11h11
  4. FOnction api specifiant la position de la souris
    Par florent dans le forum C++Builder
    Réponses: 4
    Dernier message: 15/05/2002, 20h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo