Chtite question de C pour les nuls !

Une petite question en passant :

Le background : Langage C (console) sous Windows (oui je sais c’est pas bien mais bon hein oh eh !);
La question : comment demander (en le caressant dans le sens du poil) à mon prog d’ouvrir une fenetre (API windows) d’ouverture de fichiers ? (La même fenetre que l’on obtient si on fait “Fichier/Ouvrir”).
… ça doit être possible mais google n’est pas mon ami ce soir !

D’avance merci !

Bon bah le pti lien MSDN kivabien : MSDN

en effet, il ne me reste plus qu’a comprendre comment l’utiliser (et c’est pas une mince affaire)… merci !

Cadeau…
Explication des params :

  • HWND Parent : fenêtre parent (ah oué ?). Tu peux tenter un NULL ou un GetDesktopWindow()
  • Title : titre (sans déc’?)
  • Mask : masque genre « *.gif »
  • FileName : string ptr dans lequel tu mettre un nom de fichier en entrée et qui contiendra le nom choisi par le user en sortie.
    Retour : 0 = pb, pas 0 = ok
    Pas testé en console mais je pense que ça doit fonctionner.
    PS : tout commentaire désobligeant refusé. C’est un vieux bout de code qui doit dater de 1999 et que je ré-utilise tout le temps sans jamais prendre le temps de l’améliorer. J’ai attrapé fainéant :stuck_out_tongue:
    PS2 : j’ai le même pour de l’ouverture de fichier de sauvegarde.

[code]ULONG SYS_SelectFileForLoad(HWND Parent, char* Title, char* Mask, char* FileName)
{
OPENFILENAME ofn;
char r;
char string[MAX_PATH];
char mask[32];
char curdir[MAX_PATH];
char fname[MAX_PATH];

fname[0]=0;
if (!FileName[0])
{

GetCurrentDirectory(MAX_PATH,curdir);
}
else
{
SYS_ExtractPath(FileName,curdir);
if (!curdir[0])
{
GetCurrentDirectory(MAX_PATH,curdir);
}
SYS_ExtractFileName(FileName,fname);
}

memset(mask,0,32);
sprintf(mask,"{*.%s}\0",Mask);
sprintf(string,"*.%s\0",Mask);
memcpy(&mask[strlen(mask)+1],string,strlen(string));

memset(&ofn,0,sizeof(OPENFILENAME));
ofn.lStructSize	=	sizeof(OPENFILENAME);
ofn.hwndOwner	  =	NULL;
ofn.hInstance	  =	GetModuleHandle(NULL);
ofn.lpstrFilter		=	mask;
ofn.lpstrCustomFilter	=	NULL;
ofn.nFilterIndex	=	0;
ofn.lpstrFile	  =	fname;
ofn.nMaxFile	  =	500;
ofn.lpstrTitle	  =	Title;
ofn.Flags=OFN_EXPLORER|OFN_PATHMUSTEXIST|OFN_FILEMUSTEXIST|OFN_ENABLESIZING

|OFN_LONGNAMES;
ofn.Flags |= OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
ofn.lpstrDefExt = « *\0 »;
ofn.lpstrInitialDir = curdir;

r=GetOpenFileName ( &ofn );
strcpy(FileName,fname);
return(r);

}[/code]

Alors je me suis empressé de tester ça, j’ai juste un ptit bug lors de la compilation :

[code]ofn.flags=OFN_EXPLORER|OFN_PATHMUSTEXIST|OFN_FILEMUSTEXIST|OFN_ENABLESIZING|OFN_

LONG
NAMES;[/code]

-> ‘OFN_LONG’ : undeclared Identifier …

Comme c’est pas une variable mais un flag, c’est qu’il doit me manquer qqch… un header ou autre non ?

comme headers j’ai :

#include <stdio.h> #include <stdlib.h> #include <math.h> #include <windows.h> #include <conio.h>

si je met la ligne en commentaire, je peux lancer le link et alors j’ai les deux erreurs suivantes :

if (!FileName[0]) { GetCurrentDirectory(MAX_PATH,curdir); } else { SYS_ExtractPath(FileName,curdir); if (!curdir[0]) { &nbsp;GetCurrentDirectory(MAX_PATH,curdir); } SYS_ExtractFileName(FileName,fname); }

-> unresolved external symbol _SYS_ExtractFileName
-> unresolved external symbol _SYS_ExtractPath

Ca dit qqch a qqun ?

AntoineViau t’as filé le code pour la méthode SYS_SelectFileForLoad, il te faut aussi le code pour les méthodes SYS_ExtractFileName et SYS_ExtractPath.

Je suppose d’ailleurs que tu dois avoir des warning indiquant que le compilo ne connait pas ces méthodes et il t’informe qu’il les considère comme externe retournant ‘int’, non ?

Si ce n’est pas le cas c’est que le compilo avec ses options actuelles, est trop tolérant. Je recommande vivement de mettre tous les warnings à fond.

Pour ce qui est de la constante OFN_LONG, il faut inclure le .h adéquate. Regarde la doc de GetOpenFileName ou fait une recherche sur MSDN de la constante OFN_LONG.

[quote name=‹ JakeGrafton › date=’ 19 Jan 2005, 12:17’]Alors je me suis empressé de tester ça, j’ai juste un ptit bug lors de la compilation :

[code]ofn.flags=OFN_EXPLORER|OFN_PATHMUSTEXIST|OFN_FILEMUSTEXIST|OFN_ENABLESIZING|OFN_

LONG
NAMES;[/code]

→ ‹ OFN_LONG › : undeclared Identifier …

Comme c’est pas une variable mais un flag, c’est qu’il doit me manquer qqch… un header ou autre non ?[/quote]

Rooooooh, tu as fait un vilain copier/coller sans vérifier la gueule du code :stuck_out_tongue:
Il faut lire « OFN_LONGNAMES ». Autrement dit : virer le retour à la ligne entre « OFN_LONG » et « NAMES ».

[quote]-> unresolved external symbol _SYS_ExtractFileName
→ unresolved external symbol _SYS_ExtractPath[/quote]

Oups, ça en revanche c’est ma faute. Ce sont d’autres fonctions que j’ai écrites et que j’ai oublié de mettre.
Vala les bestioles à coller avant la SYS_SelectFileForLoad :

[code]ULONG SYS_ExtractFileName(char* Path, char* Name)
{
long i,j;
char temp[MAX_PATH];

for(j=0,i=strlen(Path)-1; i>=0 && Path[i]!='\\' && Path[i]!='//'; i--,j++)

 temp[j]=Path[i];
temp[j]=0;

for(i=strlen(temp)-1,j=0; i>=0; i--,j++)

 Name[j]=temp[i];
Name[j]=0;

return(1);

}

//--------------------------------------------------------------------------------------------------------------

ULONG SYS_ExtractPath(char* FullPath, char* Path)
{
long i;

for(i=strlen(FullPath)-1; i>=0 && FullPath[i]!='\\' && FullPath[i]!='//'; i--);
strncpy(Path,FullPath,i+1);
Path[i+1]=0;

return(1);

}[/code]

Autant pour moi pour le copier/coller :P" je veux bien me faire flageller si vous voulez !!
Pour les autres fonctions, merci bcp, je teste ça dans la soirée !