Aide - Recherche - Membres - Calendrier
Version complète : [RESOLU] pb avec appli win32
Forum PC INpact > Systèmes, logiciels et lignes de codes > Programmation et Création web > Programmation (C, Perl, Python, Java...)
mogwai93
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 :

CODE

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... biggerGrin.gif


merci

ps : je developpe sous windows
avec Devc++
oposs
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 ?
mogwai93
QUOTE (oposs @ 12-07-2005 11:18:30)
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....
oposs
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?
mogwai93
QUOTE (oposs @ 13-07-2005 09:52:38)
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 :
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 pleure.gif
Ceci est une version "bas débit" de notre forum. Pour voir la version complète avec plus d'informations, la mise en page et les images, veuillez cliquer ici.
Invision Power Board © 2001-2009 Invision Power Services, Inc.