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

Windows Discussion :

Crash sur PULARGE_INTEGER


Sujet :

Windows

  1. #1
    Membre régulier
    Avatar de alpha_one_x86
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    411
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Somme (Picardie)

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

    Informations forums :
    Inscription : Décembre 2006
    Messages : 411
    Points : 113
    Points
    113
    Par défaut Crash sur PULARGE_INTEGER
    Bonjour, j'ai un crash lors de l'accés à mon PULARGE_INTEGER, voila mon code:
    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
    	PULARGE_INTEGER lpFreeBytesAvailable=0;
    	PULARGE_INTEGER lpTotalNumberOfBytes=0;
    	PULARGE_INTEGER lpTotalNumberOfFreeBytes=0;
    	WCHAR lpDirectoryName[mountPoint.length()*2];
    	int tempLen=mountPoint.toLower().toWCharArray(lpDirectoryName);
    	lpDirectoryName[mountPoint.size()]='\0';
    	if(GetDiskFreeSpaceEx(lpDirectoryName,lpFreeBytesAvailable,lpTotalNumberOfBytes,lpTotalNumberOfFreeBytes)==0)
    	{
    		DEBUGCONSOLE(10,"freeSpaceDrive","Unable stat this mount point: "+QString().fromWCharArray(lpDirectoryName)+", for len: "+QString::number(tempLen)+", error number: "+QString::number(GetLastError()));
    		return -1;
    	}
    	else
    	{
    		/*DEBUGCONSOLE(70,"freeSpaceDrive","lpFreeBytesAvailable: "+QString::number((qint64)lpFreeBytesAvailable->QuadPart));
    		DEBUGCONSOLE(70,"freeSpaceDrive","lpTotalNumberOfBytes: "+QString::number((qint64)lpTotalNumberOfBytes->QuadPart));
    		DEBUGCONSOLE(70,"freeSpaceDrive","lpTotalNumberOfFreeBytes: "+QString::number((qint64)lpTotalNumberOfFreeBytes->QuadPart));*/
    		lpFreeBytesAvailable->QuadPart=0;
    		return -1;
    	}
    	return -1;
    Et ce la crash sur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    lpFreeBytesAvailable->QuadPart=0;
    Que faire? Comment obtenir le nombre en long long int?
    Merci d'avance.
    Développeur d'Ultracopier

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Ceci montre exactement ton problème, avec LPDWORD pour PULARGE_INTEGER.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre régulier
    Avatar de alpha_one_x86
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    411
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Somme (Picardie)

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

    Informations forums :
    Inscription : Décembre 2006
    Messages : 411
    Points : 113
    Points
    113
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Ceci montre exactement ton problème, avec LPDWORD pour PULARGE_INTEGER.
    J'ai pas compris peu tu développé et le formuler autrement?
    Merci.
    Développeur d'Ultracopier

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    En gros: PULARGE_INTEGER signifie "pointeur sur ULARGE_INTEGER".

    Donc, il te suffit de faire:
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    	ULARGE_INTEGER uFreeBytesAvailable=0;
    	ULARGE_INTEGER uTotalNumberOfBytes=0;
    	ULARGE_INTEGER uTotalNumberOfFreeBytes=0;
    	/* À ta place, j'utiliserais un tableau de TCHAR ici,
    	   mais je ne connais pas le type de mountPoint.
    	   Mais si tu utilises des WCHAR, autant bien le faire:*/
    	WCHAR lpDirectoryName[mountPoint.length()*2]; //Pourquoi *2 exactement? (je vois une raison valide, mais je veux être sûr)
    	int tempLen=mountPoint.toLower().toWCharArray(lpDirectoryName);
    	lpDirectoryName[mountPoint.size()] = L'\0';
    	if(!GetDiskFreeSpaceExW(lpDirectoryName, &uFreeBytesAvailable, &uTotalNumberOfBytes, &uTotalNumberOfFreeBytes))
    	{
    		//Erreur
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Membre régulier
    Avatar de alpha_one_x86
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    411
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Somme (Picardie)

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

    Informations forums :
    Inscription : Décembre 2006
    Messages : 411
    Points : 113
    Points
    113
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    En gros: PULARGE_INTEGER signifie "pointeur sur ULARGE_INTEGER".

    Donc, il te suffit de faire:
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    	ULARGE_INTEGER uFreeBytesAvailable=0;
    	ULARGE_INTEGER uTotalNumberOfBytes=0;
    	ULARGE_INTEGER uTotalNumberOfFreeBytes=0;
    	/* À ta place, j'utiliserais un tableau de TCHAR ici,
    	   mais je ne connais pas le type de mountPoint.
    	   Mais si tu utilises des WCHAR, autant bien le faire:*/
    	WCHAR lpDirectoryName[mountPoint.length()*2]; //Pourquoi *2 exactement? (je vois une raison valide, mais je veux être sûr)
    	int tempLen=mountPoint.toLower().toWCharArray(lpDirectoryName);
    	lpDirectoryName[mountPoint.size()] = L'\0';
    	if(!GetDiskFreeSpaceExW(lpDirectoryName, &uFreeBytesAvailable, &uTotalNumberOfBytes, &uTotalNumberOfFreeBytes))
    	{
    		//Erreur
    Avec ton code j'ai:
    main.cpp:794: error: conversion from 'int' to non-scalar type 'ULARGE_INTEGER' requested
    main.cpp:795: error: conversion from 'int' to non-scalar type 'ULARGE_INTEGER' requested
    main.cpp:796: error: conversion from 'int' to non-scalar type 'ULARGE_INTEGER' requested
    TChar spécifique à vc++? Si oui hors de question car le code doit compiler avec mingw.
    //Pourquoi *2 -> je sais pas mais j'ai préférer prévoir large pour utf16 et autre encodage sur 16Bits.
    mountPoint -> variable de type QString (de Qt) avec utilisation de la méthode:
    int QString::toWCharArray ( wchar_t * array ) const
    Développeur d'Ultracopier

  6. #6
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Ah, c'est l'initialisation à zéro qui foire.
    Essaie sans (de toute façon, la fonction s'occupe de les initialiser).

    TCHAR n'est pas spécifique à Visual, ça existe aussi sous MINGW. Par contre, sous les Visual récents, tu as des facilités pour changer entre TCHAR=char et TCHAR=wchar_t depuis les options du projet. Pour MinGW, c'est une question de -DUNICODE -D_UNICODE sur la ligne de commande.
    Edit: Mais selon ce que je vois sur la doc de QString, il est mieux de rester en WCHAR et d'employer GetDiskFreeSpaceExW().

    Si tes QString sont déjà en UTF-16, le *2 est inutile. Si elles sont en UTF-32, le *2 est acceptable. Et d'après la doc, c'est inutile:
    Citation Envoyé par la doc
    (allocating the array with the same length as the string is always sufficient)
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

Discussions similaires

  1. [OLE2/ActiveX] Crash sur appel à InvokeHelper
    Par pierre_h dans le forum MFC
    Réponses: 7
    Dernier message: 10/02/2009, 10h51
  2. Fonction RSA_print_fp crash sur Windows
    Par bkadoum dans le forum C
    Réponses: 3
    Dernier message: 29/01/2009, 11h58
  3. Opengl & Vista, crash sur glTexImage2D
    Par Tosh dans le forum OpenGL
    Réponses: 5
    Dernier message: 03/04/2007, 11h21
  4. Réponses: 8
    Dernier message: 06/09/2006, 17h36
  5. [Disques Durs] Prévenir un crash sur un disque dur
    Par Furius dans le forum Composants
    Réponses: 6
    Dernier message: 07/01/2006, 17h04

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