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.

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    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 381
    Points : 41 578
    Points
    41 578
    Par défaut
    Ceci montre exactement ton problème, avec LPDWORD pour PULARGE_INTEGER.

  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.

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    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 381
    Points : 41 578
    Points
    41 578
    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

  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

  6. #6
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    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 381
    Points : 41 578
    Points
    41 578
    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)

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