Probleme de string!

frdestroyers27 Messages postés 93 Date d'inscription mardi 27 mai 2003 Statut Membre Dernière intervention 19 avril 2008 - 7 févr. 2004 à 23:34
frdestroyers27 Messages postés 93 Date d'inscription mardi 27 mai 2003 Statut Membre Dernière intervention 19 avril 2008 - 12 févr. 2004 à 07:11
Bonjours a tous!
j'ai un probleme que je n'arrive pas a resoudre et je ne trouve pas d'aide nul part pour ca!
je vais mettre mon code
en gros ca cherche les playlist de winamp les affiche a l'ecran
(jusqu'a 50 max)
ca ouvre le premier playlist trouver et j'essai de faire un renderfile du mp3 du playlist
c'est en win32 console app

#include <windows.h>
#include <string.h>
#include <tchar.h>
#include <stdlib.h>
#include <stdio.h>
#include <wchar.h>
#include <conio.h>
#include
#include <dshow.h>
#include
#include <malloc.h>

#define SAFE_RELEASE(i) {if (i) i->Release(); i = NULL;}
void lister(LPCTSTR fichier);
void file_load();

void kill_dshow();
BOOL file_render(LPTSTR szMusicFile);

TCHAR nom[50][MAX_PATH]; //contient nom des playlists
IGraphBuilder *pGraph=NULL;
IMediaControl *pControl=NULL;
IMediaEvent *pEvent=NULL;
HRESULT hr;

int main(void)
{
CoInitialize(NULL);
lister("c:\\*.m3u");
CoCreateInstance(CLSID_FilterGraph,NULL,CLSCTX_INPROC_SERVER,
IID_IGraphBuilder,(void**)&pGraph);

hr=pGraph->QueryInterface(IID_IMediaControl,(void**)&pControl);
if(FAILED(hr))
{
cout<<"erreur Query IMediaControl";
pGraph->Release();
pGraph=NULL;
CoUninitialize();

return 0;
}

hr=pGraph->QueryInterface(IID_IMediaEvent,(void**)&pEvent);
if(FAILED(hr))
{
cout<<"erreur query IMediaEvent";
pGraph->Release();
pControl->Release();
CoUninitialize();
return 0;
}

file_load();

kill_dshow();
CoUninitialize();
system("Pause");
return 1;

}

void lister(LPCTSTR fichier)
{
WIN32_FIND_DATA wData;


HANDLE listing;
listing = FindFirstFile(fichier, &wData);
if(listing==INVALID_HANDLE_VALUE)
{
cout<<"\nAucun txt\n\n";
return;
}
lstrcpy(nom[0],wData.cFileName);
cout<< nom[0] << endl;
for(int i=1;i<=50;i++)
{

FindNextFile(listing, &wData);
if(GetLastError()==ERROR_NO_MORE_FILES)
{
lstrcpy(nom[i],"");
}
else
{
lstrcpy(nom[i],wData.cFileName);
}
cout<< nom[i] << endl;
}

FindClose(listing);
}

void file_load()
{
FILE *playlist;
LPTSTR szPlaylist;
LPTSTR szResult;
szPlaylist=(LPTSTR)malloc(MAX_PATH);
//szResult=(LPTSTR)malloc(MAX_PATH);
TCHAR path[MAX_PATH]="C:\";
_tcscat(path,nom[0]);
playlist=_tfopen(path,"rt");
_fgetts(szPlaylist,_MAX_PATH,playlist);
_fgetts(szPlaylist,_MAX_PATH,playlist);
_fgetts(szPlaylist,_MAX_PATH,playlist);
szResult=TEXT(szPlaylist);//meme sans faire ca, ca marche pas!
cout<<szPlaylist; //j'affiche voir si c'est ok!

file_render(szResult);
fclose(playlist);
}

void kill_dshow()
{
SAFE_RELEASE(pControl);
SAFE_RELEASE(pEvent);
SAFE_RELEASE(pGraph);

}

BOOL file_render(LPTSTR szMusicFile)
{

WCHAR wFile[MAX_PATH];
MultiByteToWideChar(CP_ACP,0,szMusicFile,-1,wFile,MAX_PATH);
hr=pGraph->RenderFile((LPCWSTR)wFile,NULL);
if(FAILED(hr))
{
cout<<"\n"<<"erreur de renderfile"<<"\n";
return FALSE;
}
return TRUE;
}

si quelqu'un peux m'aider ca serait tres tres apprecier parce que la je sait plus quoi faire!
Merci d'avance!
Destroyers27

6 réponses

ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
8 févr. 2004 à 15:02
en codant le nom en dur est-ce que ça marche (les chaînes unicode entre "" doivent avoir L devant):

pGraph->RenderFile(L"met le nom ici",NULL);

sinon, page msdn sur l'interface IGraphBuilder :

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/directx9_c/directx/htm/igraphbuilderinterface.asp
0
frdestroyers27 Messages postés 93 Date d'inscription mardi 27 mai 2003 Statut Membre Dernière intervention 19 avril 2008
8 févr. 2004 à 20:23
t'a raison c'est la bonne methode sauf que de cette facon le nom du fichier doit etre predeterminer mon probleme c'est que je lis dans un fichier c'est storer dans une variable comment faire pour que le L soit la il doit y avoir un moyen que ca marche parce que lorsque que je me sert de OPENFILE
le code qui fait un browser pour choisir un fichier ben la variable retourner ca marche avec le renderfile et je sais pas comment il traite la variable pour que ca marche!
pour le site de microsoft j'ai ete voir deja c'est pas expliquer c'est d'ailleur toujours tres mal expliquer!
il montre comment s'en servir avec un nom de fichier
pgraph->RenderFile(L"c:\\musique.mp3",NULL);
eu prenne plutot un avi mais c'est la meme affaire
mais ca change rien a mon probleme!
si ya un moyen j'aimerais bien le savoir parce que je suis vraiment desesperer ca fait comme 9 fois que j'essaie des code different et ca marche jamais!
Destroyers27
0
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
8 févr. 2004 à 23:16
Lors de la conversion ANSI->UNICODE essai ça :

WCHAR wFile[MAX_PATH];
wsprintfW(wFile, L"%hs", szMusicFile);
hr=pGraph->RenderFile((LPCWSTR)wFile,NULL);
0
frdestroyers27 Messages postés 93 Date d'inscription mardi 27 mai 2003 Statut Membre Dernière intervention 19 avril 2008
11 févr. 2004 à 19:14
j'ai essayer ca et ca marche pas plus!
j'ai essayer avec s et S au lieux de hs et ca marche pas non plus... j'ai essayer en enlevant la commande TEXT que je mettait et ca marche pas plus...mais j'ai fait un cout avant conversion de szMusicFile en fait j'ai fait:
cout<<"#"<<szMusicFile<<"#";
et bizarrement le '#' de la fin s'affiche juste sur l'autre ligne
je me demande si genre le reste de la string n'est pas rempli avec du garbage ou si il y aurait pas un \n dedans...
je sais pas si ca peux causer un probleme!
et si je fait un cout de wFile apres conversion ca donne de quoi comme 0x1233x0197 je sais pas si c'est normal ca aussi!
Destroyers27
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
11 févr. 2004 à 19:58
en effet, la fonction fgets garde un retour chariot à la fin de la chaîne => ça fout la merde pour ouvrir le fichier.

fait ce test avant d'ouvrir :
int len = strlen(szMusic);
if(len > 0 && szMuzic[len-1] == '\n')
szMusic[len-1] = '\0';
0
frdestroyers27 Messages postés 93 Date d'inscription mardi 27 mai 2003 Statut Membre Dernière intervention 19 avril 2008
12 févr. 2004 à 07:11
Genial! merci beaucoup!
ca marche!!!!
Destroyers27
0
Rejoignez-nous