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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Février 2011
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 22
    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 : 45
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 655
    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 ?

  3. #3
    Membre averti
    Inscrit en
    Février 2011
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 22
    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 : 45
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 655
    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...

  5. #5
    Membre averti
    Inscrit en
    Février 2011
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 22
    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
    Membre extrêmement actif

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

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

+ 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