Aller au contenu

[RESOLU] pb avec appli win32


mogwai93

Messages recommandés

j'essaie de faire un programme qui extrait les fichiers contenus dans un autre.

pour le moment, je commence avec les fichiers .pak de dune 2

certains contiennent des fichiers sons et ce sont eux qui m'interessent

voici la structure :

<position du debut du fichier 1> (4 octets)

<nom du fichier 1> (x octets)

<caractere nul>

<position du debut du fichier 2> (4 octets)

<nom du fichier 2> (x octets)

<caractere nul>

...

<position du debut du dernier fichier> (4 octets)

<nom du dernier fichier> (x octets)

<caractere nul>

<4 octets à 0>

puis

viennent les donnees

plusieurs problemes :

1) rien que le fait de lancer le programme me prend deja 3 Mo !!

pourtant rien en memoire dans le code

je ne fais qu'appeler une fenetre créée dans les ressources

2) ca ne semble pas fonctionner 2 fois de suite sur le meme fichier

pourtant mon code est simple :

DWORD filesize(FILE *fp)
{
   DWORD pos;
   DWORD pos_cur;
   pos_cur=ftell(fp);
   fseek(fp,0,SEEK_END);
   pos=ftell(fp);
   fseek(fp,pos_cur,SEEK_SET);
   return pos;
}


FILE *fp;
static BYTE *buf; // le buffer 
DWORD length_of_file;

fp=fopen(msg,"rb");

   length_of_file = filesize(fp);
   buf = (BYTE *)malloc(length_of_file + 4);
   if (buf == NULL) exit_func("Pas assez de mémoire pour charger le fichier");
   fread(buf, length_of_file, 1, fp);
   fclose (fp);

//traitement de buf

   free(buf);

de quoi peut venir le pb ?

j'espere avoir ete clair... :iloveyou:

merci

ps : je developpe sous windows

avec Devc++

Lien vers le commentaire
Partager sur d’autres sites

Qu'entends tu par "ça ne semble pas fonctionner 2 fois sur le même fichier" ?

Est-ce en relançant le programme, ou en faisant l'appel 2 fois dans le même programme.

Et qu'est ce qui ne fonctionne pas? Tu as un buffer vide ou un autre problème ?

c'est en executant le meme programme

j'ai un bouton qui me fait apparaitre une fenetre de selection

qui renseigne ici la variable msg

Scénario :

1 - lancement programme

2 - selection fichier 1

3 - affichage contenu fichier 1

4 - selection fichier 1

5 - affichage contenu fichier 1

...

n - quitter programme

mon probleme doit etre un probleme de buffer

dans certains cas, il est correct,

dans d'autres cas, ce sont des valeurs aléatoires

ici, 3 et 5 devraient etre identiques,

mais ce n'est pas toujours le cas....

Lien vers le commentaire
Partager sur d’autres sites

A priori, il n'y a pas de problème dans le code que tu as donné.

Mais le bug semble venir d'appels successifs. Est-ce que tu pourrais nous montrer un peu plus de code pour voir comment se font ces appels ?

Par exemple le fopen, la déclaration de buf, etc. sont-ils dans une fonction?

Lien vers le commentaire
Partager sur d’autres sites

A priori, il n'y a pas de problème dans le code que tu as donné.

Mais le bug semble venir d'appels successifs. Est-ce que tu pourrais nous montrer un peu plus de code pour voir comment se font ces appels ?

Par exemple le fopen, la déclaration de buf, etc. sont-ils dans une fonction?

voici un peu plus de code :

int Lire_fichier (HWND hWnd, FILE *fp)
{
    static BYTE *buf; // le buffer
    DWORD length_of_file;

   length_of_file = filesize(fp);
   buf = (BYTE *)malloc(length_of_file + 4);
   if (buf == NULL) exit_func("Pas assez de mémoire pour charger le fichier");
   fread(buf, length_of_file, 1, fp);
   fclose (fp);

   // traitement du buffer

}

bool LoadFile(char *path,char *ftitle)
{
OPENFILENAME ofn;
char File[MAX_PATH];
char Title[MAX_PATH];

ZeroMemory(File,sizeof(File));
ZeroMemory(Title,sizeof(Title));

ofn.lStructSize = sizeof(ofn); 
   ofn.hwndOwner = GetActiveWindow(); 
   ofn.hInstance = GetModuleHandle(NULL); 
   ofn.lpstrFilter = "Fichiers dune 2\0*.pak\0Tous les fichiers\0*.*\0\0"; 
   ofn.lpstrCustomFilter = NULL; 
   ofn.nMaxCustFilter = 0; //NULL; 
   ofn.nFilterIndex = 0; 
   ofn.lpstrFile = File; 
   ofn.nMaxFile = sizeof(File); 
   ofn.lpstrFileTitle = Title; 
   ofn.nMaxFileTitle = sizeof(Title); 
   ofn.lpstrInitialDir = NULL; 
   ofn.lpstrTitle = "Ouvrir un fichier..."; 
   ofn.Flags = OFN_FILEMUSTEXIST|OFN_HIDEREADONLY; 
   ofn.nFileOffset = 0; //NULL; 
   ofn.nFileExtension = 0;//NULL; 
   ofn.lpstrDefExt = "*.exe"; 
   ofn.lCustData = 0; //NULL; 
   ofn.lpfnHook = NULL; 
   ofn.lpTemplateName = NULL; 

if( !GetOpenFileName( &ofn ) )
{
 path[0] = 0;
 return false;
}

CopyMemory(path,File,sizeof(File));
if( ftitle ) CopyMemory(ftitle,Title,sizeof(Title));
 
return true;
}


BOOL CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
   char msg[MAX_PATH];
   bool ret;
   FILE *fp;

    
   switch (message)                  /* handle the messages */
   {
       case WM_CLOSE:
     	EndDialog(hwnd,0);
 break;

 case WM_COMMAND:
   switch( wParam )
   {
             case IDC_LOAD1 :
           ret = LoadFile( msg,NULL );
           if( ret ) 
                 {
                     SetWindowText(GetDlgItem(hwnd,IDC_EDIT1),msg);
           
               fp=fopen(msg,"rb");
               if (fp==NULL) 
                               MessageBox (hwnd, "File not found ?", "File not found ?", MB_OK);
                     else
                     {
                               SendMessage(GetDlgItem(hwnd, IDC_LIST2), LB_RESETCONTENT, 0,0);
                               Lire_fichier (hwnd, fp);
                     }
                  }
               break;
                               
                 
                 
             case IDC_QUIT :
               EndDialog(hwnd,0);
       break;
         }
      break;  
   }

   return false;
}


int WINAPI WinMain(  HINSTANCE hInstance,
    HINSTANCE hPrevInstance,
    LPSTR lpCmdLine,
    int nCmdShow )
{
   int i = DialogBox( hInstance,
                MAKEINTRESOURCE(IDD_DIALOG1),
                NULL,
                (DLGPROC)WindowProcedure );

   if( i == -1 ) MessageBox(NULL,"Une erreur inattendue est survenue.","TITRE",MB_OK|MB_ICONSTOP);

   return false;
}

je vais voir en mettant le fopen, le fread et le fclose dans la meme methode

EDIT : j'ai enfin trouvé

ca venait de la partie traitement, où une variable était mal déclarée :-D

Lien vers le commentaire
Partager sur d’autres sites

Archivé

Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.

×
×
  • Créer...