概要

ドラッグ&ドロップされた複数の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

動作例


画像にモザイクを掛けています。

プログラムソースの概要

gwmaimgdel.cpp

_tWinMain

ダイアログを表示します。

DlgProc1

ダイアログボックスの初期化時にDlgProc1関数にWM_INITDIALOGメッセージが発生するので、ドラッグ&ドロップを許可します。
ドラッグ&ドロップ
WMAファイルがドラッグ&ドロップされるとDlgProc1関数にWM_DROPFILESメッセージが発生するので、ファイル名を取得しリストボックスに登録します。
OKボタン
ボタンがクリックされると、DlgProc1関数にWM_COMMANDメッセージが発生するので、OKボタンのメッセージの場合、リストボックスからファイル名を取得します。
ファイルの属性よりWM/Picutreを検索しインデックス番号を保存します、見つかればインデックス番号を元にDelAttributeで属性を削除します。

ソースコード

gwmaimgdel.cpp

// ドラッグ&ドロップされたWMAファイルのアルバムアートを削除する

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

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


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

// WMAファイルのアルバムアートを削除する
bool wma_jpg_del(IWMMetadataEditor* pEditor,TCHAR* fname);


TCHAR* file=0;

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;
	}
	if(DialogBox(hInstance, TEXT("DLG1"), 0, (DLGPROC)DlgProc1)){

	}
	return 0;
}

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

LRESULT CALLBACK DlgProc1(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam){
	IWMMetadataEditor* pEditor=NULL;
	HRESULT hr;
	TCHAR buf[MAX_PATH];
	HDROP hDrop;
	UINT fmax;

	int i;

	static bool edit=false;
	switch (msg) {
		case WM_INITDIALOG:
			DragAcceptFiles(hDlg, TRUE);
			if (file)
				SendMessage(GetDlgItem(hDlg, IDC_LISTBOX1), LB_ADDSTRING, 0, (LPARAM)file);
			return TRUE;
		case WM_DROPFILES:
			hDrop = (HDROP)wParam;
			fmax = DragQueryFile((HDROP)wParam, 0xFFFFFFFF, NULL, 0);
			for (i = 0; i < (int)fmax; i++) {
				DragQueryFile(hDrop, i, buf, sizeof(buf) / sizeof(TCHAR));
				SendMessage(GetDlgItem(hDlg, IDC_LISTBOX1), LB_ADDSTRING, 0, (LPARAM)buf);
			}
			DragFinish(hDrop);
			break;
		case WM_COMMAND:
			switch (LOWORD(wParam)) {
				case IDOK:
					fmax = (UINT)SendMessage(GetDlgItem(hDlg, IDC_LISTBOX1), LB_GETCOUNT, 0, 0);
					if(0<fmax){
						hr = WMCreateEditor(&pEditor);	// オブジェクトを作成
						for (i = 0; i < (int)fmax; i++){
							SendMessage(GetDlgItem(hDlg, IDC_LISTBOX1), LB_GETTEXT, i, (LPARAM)buf);
							wma_jpg_del(pEditor, buf);
						}
					}
					EndDialog(hDlg, TRUE);
					return TRUE;
				case IDCANCEL:
					EndDialog(hDlg,FALSE);
				default:
					return FALSE;
			}
			default:
				return FALSE;
	}
	return TRUE;
}

TCHAR* errstr(HRESULT v){
	switch(v){
		case S_OK:	return _TEXT("成功");
		case E_INVALIDARG:	return _TEXT("違法なパラメータの組合せ、データ型または属性が、使われました。");
		case E_NOTIMPL:	return _TEXT("実装されません。");
		case E_POINTER:	return _TEXT("ポインターは、有効でありません");
		case NS_E_ATTRIBUTE_READ_ONLY:	return _TEXT("属性は変わることができません。");
		case NS_E_INVALID_REQUEST:	return _TEXT("wStreamNumは有効な番号でありません、または、属性がwIndexにありません");
		default: return _TEXT("不明なエラーです。");
	}
}

// WMAファイルのアルバムアートを削除する

bool wma_jpg_del(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 pwszTitle[1024];

	int index=-1;
	WORD cAttr=0;
	DWORD cbValue=0;

	hr = pHeaderInfo->GetAttributeCountEx(0xffff,&cAttr);
	for(int i=0;i<cAttr;i++){
		cbLength=sizeof(pwszTitle)/sizeof(TCHAR);
		hr=pHeaderInfo->GetAttributeByIndexEx(wStreamNum,i,pwszTitle,&cbLength,&Type,NULL,NULL,&cbValue);
		if(_tcscmp(pwszTitle,g_wszWMPicture)==0){
			index=i;
			break;
		}
	}

	if(0<index){
		hr=pHeaderInfo->DeleteAttribute(wStreamNum, index);
		if(hr!=S_OK){
			MessageBox(0,errstr(hr),_TEXT("DeleteAttribute API Error"),MB_OK);
		}
	}
	pHeaderInfo->Release();
	if(0<index)
		pEditor->Flush();
	else
		pEditor->Close();
	return flag;
}

resource.h

#define IDC_LISTBOX1	2001

resource.rc

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


DLG1 DIALOG DISCARDABLE  0, 0, 320, 221
STYLE DS_MODALFRAME | WS_POPUP
CAPTION "WMAファイルアルバムアートの削除"
FONT 9, "MS Pゴシック"
BEGIN
	LTEXT			"ここへファイルをドラッグドロップしてください", -1, 7, 7, 168, 10

	CONTROL "ListBox", IDC_LISTBOX1, "LISTBOX", WS_CHILD | WS_VISIBLE | WS_VSCROLL | LBS_DISABLENOSCROLL, 7, 21, 306, 163

	DEFPUSHBUTTON	"OK(&O)",IDOK,100,197,50,14
	PUSHBUTTON	"キャンセル(&C)",IDCANCEL,157,197,50,14
END

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