void __fastcall PlayDat(AnsiString DriveLetter)
{
// DriveLetter is a letter assigned to CD drive
AnsiString mask = DriveLetter + ":\\Mpegav\\*.dat";
TSearchRec sr;
TStringList *dat_list = new TStringList(); try
{
if (FindFirst(mask, faAnyFile, sr) == 0)
{
dat_list->Add(DriveLetter + ":\\Mpegav\\" + sr.Name);
while (FindNext(sr) == 0)
dat_list->Add(DriveLetter + ":\\Mpegav\\" + sr.Name);
FindClose(sr);
// all .dat files are in the dat_list now
// you may launch player with WinExec, ShellExecute or CreateProcess API functions
// see notes below for further considerations
}
}
__finally
{
delete dat_list;
}
}
//---------------------------------------------------------------------------
/*
Notes
=====
Если .dat файл только один, то все просто, запусти player и забудь:
ShellExecute(NULL,
"open",
"C:\\Program Files\\Windows Media Player\\mplayer2.exe",
dat_list->Strings[0].c_str(),
"",
SW_SHOWDEFAULT);
Если файлов несколько, ситуация немного сложнее, перед тем, как запускать очередной, надо подождать, пока не закончится предыдущий.
Для этого можно использовать API CreateProcess():
for (int i = 0; i < dat_list->Count; i++)
{
STARTUPINFO StartupInfo;
ZeroMemory(&StartupInfo, sizeof(STARTUPINFO));
StartupInfo.cb = sizeof(STARTUPINFO);
PROCESS_INFORMATION ProcessInfo;
AnsiString mplayer = "C:\\Program Files\\Windows Media Player\\mplayer2.exe " + dat_list->Strings[i];
if(CreateProcess(NULL,
mplayer.c_str(),
NULL,
NULL,
TRUE,
NORMAL_PRIORITY_CLASS,
NULL,
NULL,
&StartupInfo,
&ProcessInfo))
{
DWORD dwExitStatus = STILL_ACTIVE;
// loop until media player closes
do
{
if (!GetExitCodeProcess(ProcessInfo.hProcess, &dwExitStatus))
break;
Application->ProcessMessages();
} while (dwExitStatus == STILL_ACTIVE);
// close handles
CloseHandle(ProcessInfo.hProcess);
CloseHandle(ProcessInfo.hThread);
}
}
Однако этот путь не очень хорош, поскольку каждый раз надо ждать, пока юзер закроет media player.
Поэтому проще создать временный плейлист и использовать его:
char TempDir[MAX_PATH + 1];
TempDir[MAX_PATH] = '\0';
GetTempPath(MAX_PATH, TempDir); //GetTempPath() API function returns Windows temp dir with final backslash already appended
dat_list->SaveToFile(AnsiString(TempDir) + "temp.m3u");
ShellExecute(NULL,
"open",
"C:\\Program Files\\Windows Media Player\\mplayer2.exe",
(AnsiString(TempDir) + "temp.m3u").c_str(),
"",
SW_SHOWDEFAULT);
*/