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

DirectX Discussion :

Fichier .x de longueur nulle !


Sujet :

DirectX

  1. #1
    Membre à l'essai
    Inscrit en
    Février 2011
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 22
    Points : 19
    Points
    19
    Par défaut Fichier .x de longueur nulle !
    Bonjour
    Voici en quelques mots mon problème:
    Je veux enregistrer des données dans un fichier .x
    Je crée une instance ID3DXFile
    J'enregistre mes templates avec RegisterTemplates
    Je crée un objet ID3DXFileSaveObject au format texte (psaveobj)
    Je crée un buffer dans lequel je copie mes données selon le format de mon template
    Je fais un AddDataObject avec ce buffer sur mon objet psaveobj
    Je fais psaveobj->Save()
    Toutes ces opérations me renvoient S_OK et je crée bien un fichier avec le bon nom dans le bon répertoire... mais il est de longueur nulle!
    Si quelqu'un a une idée je suis preneur.
    Merci à tous par avance

  2. #2
    Modérateur
    Avatar de nouknouk
    Homme Profil pro
    Inscrit en
    Décembre 2006
    Messages
    1 655
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 655
    Points : 2 161
    Points
    2 161
    Par défaut
    salut,

    je ne connais pas du tout ce framework, donc il est (très) probable que mon idée ne soit pas la bonne. Mais d'une façon générale, ce genre de souci peut arriver quand on oublie de fermer proprement le fichier ouvert en écriture.

    Tu n'aurais pas un appel manquant à quelque chose comme 'close()' à tout hasard ?
    Mon projet du moment: BounceBox, un jeu multijoueurs sur Freebox, sur PC et depuis peu sur smartphone/tablette Android.

  3. #3
    Membre à l'essai
    Inscrit en
    Février 2011
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 22
    Points : 19
    Points
    19
    Par défaut
    L'accès au fichier se fait indirectement au travers d'un interface qui masque entièrement la gestion du fichier. Normalement, dès lors que l'on fait un Save(), l'image du fichier que l'on a construite dans le ID3DXFileSaveObject est transférée sur le disque dur dans un fichier sans que l'on ait à manipuler ledit fichier. La seule chose que l'on fait est de le nommer et de préciser si c'est du texte ou du binaire. Merci quand même d'avoir essayé.
    Je sèche toujours...

  4. #4
    Modérateur
    Avatar de nouknouk
    Homme Profil pro
    Inscrit en
    Décembre 2006
    Messages
    1 655
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 655
    Points : 2 161
    Points
    2 161
    Par défaut
    ok. Comme dit précédemment, je ne connais pas le framework, donc c'était "au cas où".

    Peut-être qu'en postant le bout de code incriminé tu obtiendras plus de réponses...
    Mon projet du moment: BounceBox, un jeu multijoueurs sur Freebox, sur PC et depuis peu sur smartphone/tablette Android.

  5. #5
    Membre à l'essai
    Inscrit en
    Février 2011
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 22
    Points : 19
    Points
    19
    Par défaut
    Héhé... tu m'as mis la puce à l'oreille.
    Et si DirectX ne faisait pas son boulot comme il faut ? Et s'il ne libérait pas le fichier avant de mourir ?
    Je me suis replongé dans la doc du SDK : pas clair.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ID3DXFileSaveObject::Save
    Saves a data object and its children to a .x file on disk.
    Remarks
    After this method succeeds, ID3DXFileSaveObject::AddDataObject,
    ID3DXFileSaveData::AddDataObject and ID3DXFileSaveData::AddDataReference
    can no longer be called until a new ID3DXFile object is created.
    Et dans la doc de ID3DXFileSaveObject::AddDataObject :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Save the created data to disk by using the ID3DXFileSaveObject::Save method.
    Pas très encourageant...
    Je continue quand même l'enquête. En remontant dans la hiérarchie, je vois que IDirectXFileSaveObject dérive de IUnknown. Je jette donc un oeil à IUnknown. 3 méthodes :
    - IUnknown::AddRef
    - IUnknown::QueryInterface
    - IUnknown::Release
    Intrigué, je regarde à quoi sert Release.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Decreases the reference count of the interface by 1.
    Ah oui... tiens donc. Pas totalement clean, alors, la destruction
    Et en bas du contrat d'assurance, c'est écrit quoi ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Remarks
    Applications must call this method to release only those interfaces that were
    explicitly created in a previous call to IUnknown::AddRef, IUnknown::QueryInterface,
    or a creation function, such as Direct3DCreate9.
    Je n'ai jamais utilisé Addref ni QueryInterface, quant à Direct3DCreate9 je n'en suis pas encore là (un jour peut-être...)
    Mais on ne sait jamais, peut-être que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    pD3DXFile->CreateSaveObject((LPCVOID)Filename, D3DXF_FILEFORMAT_TEXT, 
    D3DXF_FILESAVE_TOFILE, &pSaveObj);
    s'amuse à faire ça dans son coin !
    J'ajoute donc un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    pSaveObj->Release();
    ... sans trop y croire dans mon destructeur.
    Je génère... je lance un debug...
    Et ça marche ! Un joli fichier de 640 octets m'est livré par Chroponost
    Bon, conclusions :
    - La doc n'est pas toujours claire claire... et bien des tutos (j'en avais suivi un à la lettre) se contentent de paraphraser sans même tester ce qu'ils avancent.
    - Les forums c'est super, il y a toujours quelqu'un pour attirer ton attention sur un truc qui fait penser à un autre truc...
    - Et surtout merci nouknouk

  6. #6
    Expert confirmé

    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 382
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 382
    Points : 4 936
    Points
    4 936
    Par défaut
    je veux pas faire mon chieur, mais tu ne libérais jamais tes objets à la fin de ton application? O_o

  7. #7
    Membre à l'essai
    Inscrit en
    Février 2011
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 22
    Points : 19
    Points
    19
    Par défaut
    Pas s'ils n'ont pas été créés par un new !
    D"ailleurs, si j'avais fait un delete, au mieux ça n'aurait rien changé, au pire je pense que ça aurait planté. 1°, ce n'est pas un objet mais un interface; 2° ça n'aurait pas décrémenté le "reference count" puisqu'il faut une méthode spéciale.

  8. #8
    Expert confirmé

    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 382
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 382
    Points : 4 936
    Points
    4 936
    Par défaut
    donc c'est bien ce que je pensais, directx est une api COM, ni c ni c++.

    tu fais une création "d'objets" en appelant une méthode Create*, donc il faut faire une libération de tes ressources sinon tu es bon pour des fuites de mémoire.

    et vu que c'est une api COM, tu ne fais pas de delete, mais un Release, qui libère ton objet si le ref count tombe à 0.

  9. #9
    Membre à l'essai
    Inscrit en
    Février 2011
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 22
    Points : 19
    Points
    19
    Par défaut
    Et bien voilà! C'est l'explication que j'attendais. C'est un objet .COM et c'est pour cela que je dois le libérer...
    Merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 24/04/2009, 09h12
  2. Importation Fichier Texte et valeur nulle
    Par romulus34 dans le forum VBA Access
    Réponses: 1
    Dernier message: 09/09/2008, 11h39
  3. Réponses: 2
    Dernier message: 22/05/2007, 18h23
  4. [VB6 et ORACLE] identificateur de longueur nulle interdit
    Par tim69000 dans le forum VB 6 et antérieur
    Réponses: 17
    Dernier message: 10/04/2006, 11h33
  5. [Oracle] identificateur de longueur nulle interdit - help me
    Par gregb dans le forum Bases de données
    Réponses: 1
    Dernier message: 03/07/2005, 18h35

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