WMAファイルアーティスト名・タイトル等の編集GUIプログラム(32/64bit)

icon 項目のみ表示/展開表示の切り替え

概要

本プログラムのEXEファイルにWMAファイルをドラッグ&ドロップまたは、起動時にWMAファイルを指定すると、タイトル、アルバムタイトル、アーティスト等をダイアログボックスのエディットボックス表示します。
エディットボックスの値を編集した場合、OKをクリックするとWMAファイルを変更します。

テスト環境

コンパイラ

Visual C++ 2008/2013 Express 32/64bit マルチバイト/UNICODE

実行環境

Windows XP Professional Service Pack 3 32bit(Virtual Box上の仮想マシーン)
Windows 7 Enterprise Service Pack 1 64bit

動作例

本プログラムを起動した状態

プログラムソースの概要

gwmap.cpp

_tWinMain

起動前にドラッグ&ドロップされた場合、そのファイル名を保存します。起動前にドラッグ&ドロップされなかった場合は、ファイル入力のコモンダイアログボックスを表示ファイル名の取得します。

DlgProc1

ダイアログの初期化時にDlgProc1関数にWM_INITDIALOGメッセージが発生するので、ファイル名をダイアログボックスに表示します。その後、WMAファイルのタイトル名等を取得し、ダイアログボックスに表示します。
エディットボックスが編集された場合
WM_COMMANDメッセージが発生するので、HIWORD(wParam)==EN_UPDATEである場合、エディットボックスが変更されたことを示すメッセージとなるので、編集されたことをedit変数に保存します。
OKボタン
ボタンがクリックされると、DlgProc1関数にWM_COMMANDメッセージが発生するので、OKボタンのメッセージの場合、ダイアログボックスの各エディットボックスの文字列を取得し、WMAファイルを変更します。

wma_title_get

ダイアログボックスのエディットボックスの内容を取得しSetAttribute APIでWMAファイルを変更します。

wma_title_chg

WMAファイルのタイトル・アルバムタイトル・アーティスト名を全角から半角に変換します。

ソースコード

gwmap.cpp

// ドラッグ&ドロップ又は起動時に指定したWMAファイルのタイトル・アルバムタイトル・アーティスト名等を編集する

#include <windows.h>
#include <tchar.h>
#include <wmsdk.h>
#include <stdio.h>
#include "resource.h"

#pragma comment(lib,"wmvcore.lib")

// ファイル名を指定するコモンダイアログを表示
BOOL GetFileName(TCHAR* fname,int sz);

// ダイアログボックスのプロシージャー
LRESULT CALLBACK DlgProc1(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam);

// WMAファイルのタイトル・アルバムタイトル・アーティスト名等をダイアログボックスに表示する
bool wma_title_get(IWMMetadataEditor* pEditor,TCHAR* fname);

// WMAファイルのタイトル・アルバムタイトル・アーティスト名等を変更する
bool wma_title_chg(IWMMetadataEditor* pEditor,TCHAR* fname);

TCHAR* file=0;
HWND hDlg;

int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPreInst,TCHAR* lpszCmdLine, int nCmdShow){
        TCHAR f[MAX_PATH];
        if(lpszCmdLine[0]){
                if(lpszCmdLine[0]==_T('\"')){
                        _tcscpy_s(f,sizeof(f)/sizeof(TCHAR),lpszCmdLine+1);
                        f[ _tcslen(f) -1]=_T('\0');
                        file=f;
                }else
                        file=lpszCmdLine;
        }else{
                if (GetFileName(f, sizeof(f) / sizeof(TCHAR)) == FALSE){
                        return - 1;
                }
                file=f;
        }
        if(DialogBox(hInstance, TEXT("DLG1"), 0, (DLGPROC)DlgProc1)){

        }
        return 0;
}

// ファイル名を指定するコモンダイアログを表示

BOOL GetFileName(TCHAR* fname,int sz){
        OPENFILENAME o;
        fname[0]=_T('\0');
        ZeroMemory(&o,sizeof(o));
        o.lStructSize=sizeof(o);
        o.Flags=0;
        o.lpstrFile=fname;
        o.nMaxFile=sz;
        o.lpstrFilter=_TEXT("WMA files(*.wma)\0\0");
        o.lpstrDefExt = _TEXT("wma");
        o.lpstrTitle = _TEXT("WMAファイルを指定");
        o.nFilterIndex = 1;
        return GetOpenFileName(&o);
}


// ダイアログボックスのプロシージャー

LRESULT CALLBACK DlgProc1(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam){
        IWMMetadataEditor* pEditor=NULL;
        HRESULT hr;
        static bool edit=false;
        switch (msg) {
                case WM_INITDIALOG:
                        ::hDlg=hDlg;
                        SetWindowText(hDlg,file);
                        hr = WMCreateEditor(&pEditor);      // オブジェクトを作成
                        if(wma_title_get(pEditor, file)==false)
                                        EndDialog(hDlg, TRUE);
                        return TRUE;
                case WM_COMMAND:
                        switch (LOWORD(wParam)) {
                                case IDOK:
                                        if(edit==true){
                                                hr = WMCreateEditor(&pEditor);      // オブジェクトを作成
                                                wma_title_chg(pEditor, file);

                                        }
                                        EndDialog(hDlg, TRUE);
                                        return TRUE;
                                case IDCANCEL:
                                        EndDialog(hDlg,FALSE);
                                        return FALSE;
                                case IDC_TITLE:
                                case IDC_AUTHOR:
                                case IDC_ALBUM_ARTIST:
                                case IDC_ALBUM_TITLE:
                                case IDC_TRACK_NUMBER:
                                        if(HIWORD(wParam)==EN_UPDATE){  // エディットボックスが変更されたときに発生する
                                                edit=true;      //      編集された場合にtrue
                                        }
                                        return FALSE;
                                default:
                                        return FALSE;
                        }
                        default:
                                return FALSE;
        }
        return TRUE;
}

// WMAファイルのタイトル・アルバムタイトル・アーティスト名等をダイアログボックスに表示する

bool wma_title_get(IWMMetadataEditor* pEditor,TCHAR* fname){

        bool flag=true;
        HRESULT hr;
        IWMHeaderInfo3* pHeaderInfo=NULL;

        hr=pEditor->Open(fname);
        if(FAILED(hr)){
                MessageBox(::hDlg,fname,_TEXT("ファイルが開けません"),MB_OK);
                return false;
        }
        pEditor->QueryInterface(IID_IWMHeaderInfo3,(void**)&pHeaderInfo);

        WORD wStreamNum = 0;
        WMT_ATTR_DATATYPE Type;
        WORD cbLength=0;

        TCHAR* getname;
        TCHAR pwszTitle[1024];
        WM_PICTURE* pP=0;

        //      タイトルを取得
        Type=WMT_TYPE_STRING;
        getname=_TEXT("Title");
        pwszTitle[0]=_T('\0');
        hr=pHeaderInfo->GetAttributeByName(&wStreamNum,getname,&Type, NULL, &cbLength );
        hr = pHeaderInfo->GetAttributeByName( &wStreamNum, getname, &Type,(BYTE *) pwszTitle, &cbLength );
        SetWindowText(GetDlgItem(::hDlg,IDC_TITLE),pwszTitle);

        //      参加アーティストを取得
        Type=WMT_TYPE_STRING;
        getname=_TEXT("Author");
        pwszTitle[0]=_T('\0');
        hr=pHeaderInfo->GetAttributeByName(&wStreamNum,getname,&Type, NULL, &cbLength );
        hr = pHeaderInfo->GetAttributeByName( &wStreamNum, getname, &Type,(BYTE *) pwszTitle, &cbLength );
        SetWindowText(GetDlgItem(::hDlg,IDC_AUTHOR),pwszTitle);
        
        //      アルバムアーティストを取得
        Type=WMT_TYPE_STRING;
        getname=_TEXT("WM/AlbumArtist");
        pwszTitle[0]=_T('\0');
        hr=pHeaderInfo->GetAttributeByName(&wStreamNum,getname,&Type, NULL, &cbLength );
        hr = pHeaderInfo->GetAttributeByName( &wStreamNum, getname, &Type,(BYTE *) pwszTitle, &cbLength );
        SetWindowText(GetDlgItem(::hDlg,IDC_ALBUM_ARTIST),pwszTitle);

        //      アルバムタイトルを取得
        Type=WMT_TYPE_STRING;
        getname=_TEXT("WM/AlbumTitle");
        pwszTitle[0]=_T('\0');
        hr=pHeaderInfo->GetAttributeByName(&wStreamNum,getname,&Type, NULL, &cbLength );
        hr = pHeaderInfo->GetAttributeByName( &wStreamNum, getname, &Type,(BYTE *) pwszTitle, &cbLength );
        SetWindowText(GetDlgItem(::hDlg,IDC_ALBUM_TITLE),pwszTitle);

        //      トラック番号を取得
        Type=WMT_TYPE_STRING;
        getname=_TEXT("WM/TrackNumber");
        pwszTitle[0]=_T('\0');
        hr=pHeaderInfo->GetAttributeByName(&wStreamNum,getname,&Type, NULL, &cbLength );
        hr = pHeaderInfo->GetAttributeByName( &wStreamNum, getname, &Type,(BYTE *) pwszTitle, &cbLength );
        if (Type == WMT_TYPE_DWORD){
                DWORD v = *((DWORD *)pwszTitle);
                _stprintf_s(pwszTitle, sizeof(pwszTitle) / sizeof(TCHAR), _TEXT("%i"), v);
        }
        SetWindowText(GetDlgItem(::hDlg,IDC_TRACK_NUMBER),pwszTitle);

        pHeaderInfo->Release();
        pEditor->Close();
        return flag;
}

// WMAファイルのタイトル・アルバムタイトル・アーティスト名等を変更する

bool wma_title_chg(IWMMetadataEditor* pEditor,TCHAR* fname){

        bool flag=false;
        HRESULT hr;
        IWMHeaderInfo3* pHeaderInfo=NULL;

        hr=pEditor->Open(fname);
        pEditor->QueryInterface(IID_IWMHeaderInfo3,(void**)&pHeaderInfo);

        WORD wStreamNum = 0;
        WMT_ATTR_DATATYPE Type;
        WORD cbLength=0;

        TCHAR* getname;
        TCHAR pwszTitle[1024];
        WM_PICTURE* pP=0;

        //      タイトルを変更
        Type=WMT_TYPE_STRING;
        getname=_TEXT("Title");
        GetWindowText(GetDlgItem(::hDlg,IDC_TITLE),pwszTitle,sizeof(pwszTitle)/sizeof(TCHAR));
        cbLength=(WORD)_tcslen(pwszTitle)*sizeof(TCHAR);
        hr = pHeaderInfo->SetAttribute( wStreamNum, getname, Type,(BYTE *) pwszTitle, cbLength );

        //      参加アーティストを変更
        Type=WMT_TYPE_STRING;
        getname=_TEXT("Author");
        GetWindowText(GetDlgItem(::hDlg,IDC_AUTHOR),pwszTitle,sizeof(pwszTitle)/sizeof(TCHAR));
        cbLength = (WORD)_tcslen(pwszTitle)*sizeof(TCHAR);
        hr = pHeaderInfo->SetAttribute( wStreamNum, getname, Type,(BYTE *) pwszTitle, cbLength );
        
        //      アルバムアーティストを変更
        Type=WMT_TYPE_STRING;
        getname=_TEXT("WM/AlbumArtist");
        GetWindowText(GetDlgItem(::hDlg,IDC_ALBUM_ARTIST),pwszTitle,sizeof(pwszTitle)/sizeof(TCHAR));
        cbLength = (WORD)_tcslen(pwszTitle)*sizeof(TCHAR);
        hr = pHeaderInfo->SetAttribute( wStreamNum, getname, Type,(BYTE *) pwszTitle, cbLength );

        //      アルバムタイトルを変更
        Type=WMT_TYPE_STRING;
        getname=_TEXT("WM/AlbumTitle");
        GetWindowText(GetDlgItem(::hDlg,IDC_ALBUM_TITLE),pwszTitle,sizeof(pwszTitle)/sizeof(TCHAR));
        cbLength = (WORD)_tcslen(pwszTitle)*sizeof(TCHAR);
        hr = pHeaderInfo->SetAttribute( wStreamNum, getname, Type,(BYTE *) pwszTitle, cbLength );

        //      トラック番号を変更
        Type = WMT_TYPE_STRING;
        getname=_TEXT("WM/TrackNumber");
        GetWindowText(GetDlgItem(::hDlg,IDC_TRACK_NUMBER),pwszTitle,sizeof(pwszTitle)/sizeof(TCHAR));
        cbLength = (WORD)_tcslen(pwszTitle)*sizeof(TCHAR);
        hr = pHeaderInfo->SetAttribute(wStreamNum, getname, Type, (BYTE *)pwszTitle, cbLength);

        pHeaderInfo->Release();
        pEditor->Flush();
        return flag;
}

resource.h

#define IDC_TITLE       2001
#define IDC_AUTHOR      2002
#define IDC_ALBUM_ARTIST        2003
#define IDC_ALBUM_TITLE 2004
#define IDC_TRACK_NUMBER        2005

resource.rc

#include <windows.h>
#include "resource.h"


DLG1 DIALOG DISCARDABLE  0, 0, 320, 185
STYLE DS_MODALFRAME | WS_POPUP
CAPTION "WMAファイルプロパティ変更"
FONT 9, "MS Pゴシック"
BEGIN
        CONTROL "タイトル(Title)", -1, "STATIC", WS_CHILD | WS_VISIBLE | SS_NOTIFY, 7, 8, 96, 14
        CONTROL "", IDC_TITLE, "EDIT", WS_CHILD | WS_DLGFRAME | WS_VISIBLE | ES_AUTOHSCROLL, 110, 7, 203, 14

        CONTROL "参加アーティスト(Author)", -1, "STATIC", WS_CHILD | WS_VISIBLE | SS_NOTIFY, 7, 29, 96, 14
        CONTROL "", IDC_AUTHOR, "EDIT", WS_CHILD | WS_DLGFRAME | WS_VISIBLE | ES_AUTOHSCROLL, 110, 28, 203, 14

        CONTROL "アルバムアーティスト(WM/AlbumArtist)", -1, "STATIC", WS_CHILD | WS_VISIBLE | SS_NOTIFY, 7, 50, 96, 28
        CONTROL "", IDC_ALBUM_ARTIST, "EDIT", WS_CHILD | WS_DLGFRAME | WS_VISIBLE | ES_AUTOHSCROLL, 110, 49, 203, 14

        CONTROL "アルバム(WM/AlbumTitle)", -1, "STATIC", WS_CHILD | WS_VISIBLE | SS_NOTIFY, 7, 71, 96, 28
        CONTROL "", IDC_ALBUM_TITLE, "EDIT", WS_CHILD | WS_DLGFRAME | WS_VISIBLE | ES_AUTOHSCROLL, 110, 70, 203, 14

        CONTROL "トラック番号(WM/TrackNumber)", -1, "STATIC", WS_CHILD | WS_VISIBLE | SS_NOTIFY, 7, 92, 96, 28
        CONTROL "", IDC_TRACK_NUMBER, "EDIT", WS_CHILD | WS_DLGFRAME | WS_VISIBLE | ES_AUTOHSCROLL, 110, 91, 203, 14

        DEFPUSHBUTTON   "OK(&O)",IDOK,85,168,50,14
        PUSHBUTTON      "キャンセル(&C)",IDCANCEL,185,168,50,14
END

実行ファイルとソースファイルのダウンロード