Delphi 6のTMediaPlayerはFileNameがString(AnsiString)なのでウムラウトのようなUnicode文字を含んだファイルを扱えません。
でもなんとかしたい。
ということで頭をひねってなんとか一部解決。
function gfnbFileExists(sFile:
WideString): Boolean;
//Unicode対応のFileExits。
var
lh_Handle: THandle;
lr_Info: TWin32FindDataW;
begin
if (sFile = '')
then begin
Result := False;
end else begin
Result := False;
FillChar(lr_Info, SizeOf(lr_Info), 0);
lh_Handle:= FindFirstFileW(PWideChar(sFile), lr_Info);
try
if (lh_Handle<> INVALID_HANDLE_VALUE)
then begin
repeat
if (
WideString(lr_Info.cFileName) <> '.')
and (
WideString(lr_Info.cFileName) <> '..')
and ((lr_Info.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY) = 0)
then begin
Result := True;
Break;
end;
until not(FindNextFileW(lh_Handle, lr_Info));
end;
finally
Windows.FindClose(lh_Handle);
end;
end;
end;
function gfnsFilePathGet(sFile:
WideString):
WideString;
//Unicode対応のExtractFilePath。
var
i: Integer;
begin
Result := '';
if (sFile <> '')
then begin
for i := Length(sFile)
downto 1
do begin
if (sFile[i] = '\')
or (sFile[i] = '/')
then begin
Result := Copy(sFile, 1, i);
Break;
end else if (sFile[i] = ':')
then begin
Result := Copy(sFile, 1, i) + '\';
Break;
end;
end;
end;
end;
function gfnsFileNameGet(sFile:
WideString):
WideString;
//Unicode対応のExtractFileName。
//拡張子はつく。
var
i, li_Len, li_Pos: Integer;
begin
Result := '';
if (sFile <> '')
then begin
li_Len := Length(sFile);
li_Pos := li_Len + 1;
//sFileの最後が'\'であった場合への対策。
for i := li_Len
downto 1
do begin
if (sFile[i] = '\')
or (sFile[i] = '/')
or (sFile[i] = ':')
then begin
Break;
end;
li_Pos := i;
end;
Result := Copy(sFile, li_Pos, MaxInt);
end;
end;
function gfnsShortFileNameGet(sFile:
WideString):
WideString;
{
短いファイル名を返す。
戻り値がWideStringであることに注意。
Unicode非対応のコンポーネントにファイルを渡すときの(完全ではないけれど)逃げ道。
}
var
lp_Buff: PWideChar;
begin
Result := sFile;
lp_Buff := AllocMem((MAX_PATH + 1) * 2);
try
if (GetShortPathNameW(PWideChar(sFile), lp_Buff, (MAX_PATH + 1) * 2) > 0)
then begin
Result :=
WideString(lp_Buff);
end;
finally
FreeMem(lp_Buff);
end;
end;
procedure MediaOpen(
const sWFile:
WideString);
//sWFileをMediaPlayerで開く。
var
ls_WPath, ls_WName:
WideString;
begin
if (
gfnbFileExists(sWFile))
then begin
//ファイルをパスとファイル名部分に分ける。
ls_WPath :=
gfnsFilePathGet(sWFile);
ls_WName :=
gfnsFileNameGet(sWFile);
//カレントディレクトリをsWFileのあるディレクトリに変更。
SetCurrentDirectoryW(PWideChar(ls_WPath));
with MediaPlayer
do begin
//ファイル名を短いファイル名にしてセット。
FileName :=
gfnsShortFileNameGet(ls_WName);
Open;
Play;
end;
end;
end;