Aller au contenu

[RESOLU] pb avec appli win32


mogwai93

Messages recommandés

Posté(e)

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++

Posté(e)

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 ?

Posté(e)
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....

Posté(e)

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?

Posté(e)
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

Archivé

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

×
×
  • Créer...