参考:To Retrieve All Metadata in a File
IWMHeaderInfo3::GetAttributeByIndexEx method
ID3 Tag Support
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 | #include <stdio.h> //printf とかで必要 #include <wmsdk.h> //HRESULT とかで必要 using namespace System; //Console::ReadLine()で必要 #pragma comment(lib, "wmvcore.lib") //IWMMetadataEditor とかで必要 #ifndef GOTO_EXIT_IF_FAILED #define GOTO_EXIT_IF_FAILED(hr) if(FAILED(hr)) goto Exit; #endif #ifndef SAFE_ARRAY_DELETE #define SAFE_ARRAY_DELETE(x) \ if (x != NULL) \ { \ delete [] x; \ x = NULL; \ } #endif void main(){ HRESULT hr = S_OK; IWMMetadataEditor * pEditor = NULL; IWMHeaderInfo3 * pHeaderInfo = NULL; hr = WMCreateEditor(&pEditor); hr = pEditor->Open(L "G:\\sampleMovie\\Amanda.wma" ); hr = pEditor->QueryInterface(IID_IWMHeaderInfo, ( void **) &pHeaderInfo); WORD cAttributes = 0; WCHAR * pwszName = NULL; WORD cchName = 0; BYTE * pbValue = NULL; DWORD cbValue = 0; WORD langIndex = 0; WORD attIndex = 0; WMT_ATTR_DATATYPE attType; // Get the total number of attributes in the file. //ファイルの属性の総数を取得します。 hr = pHeaderInfo->GetAttributeCountEx(0xFFFF, &cAttributes); GOTO_EXIT_IF_FAILED(hr); // Loop through all the attributes, retrieving and displaying each. //すべての属性をループし取得表示 for (attIndex = 0; attIndex < cAttributes; attIndex++) { //printf("%d 回目\r\n ", attIndex); // Get the required buffer lengths for the name and value. //名前と値のために必要なバッファ長を取得します。 hr = pHeaderInfo->GetAttributeByIndexEx(0xFFFF, attIndex, NULL, &cchName, NULL, NULL, NULL, &cbValue); GOTO_EXIT_IF_FAILED(hr); // Allocate the buffers. //バッファを割り当てる。属性名 pwszName = new WCHAR [cchName]; //WCHAR *pbValue = (WCHAR *) new BYTE[ cbValue ]; //pwszName = (WCHAR *) new BYTE[ cchName ]; if (pwszName == NULL) { printf ( "割り当て失敗\r\n" ); hr = E_OUTOFMEMORY; goto Exit; } ////属性の値 pbValue = new BYTE [cbValue]; if (pbValue == NULL) { printf ( "割り当て失敗\r\n" ); hr = E_OUTOFMEMORY; goto Exit; } ////属性を取得します。 hr = pHeaderInfo->GetAttributeByIndexEx(0xFFFF, attIndex, pwszName, &cchName, &attType, &langIndex, pbValue, &cbValue); GOTO_EXIT_IF_FAILED(hr); // Display the attribute global index and name. //表示 属性のグローバルインデックスと名前 printf ( "%3d - %S (Language %d):\n\t " , attIndex, pwszName, langIndex); // Display the attribute depending upon type. // 属性のタイプ別に表示 switch (attType) { case WMT_TYPE_DWORD: case WMT_TYPE_QWORD: case WMT_TYPE_WORD: printf ( "%d\n\n" , ( DWORD ) *pbValue); break ; case WMT_TYPE_STRING: printf ( "%S\n\n" , ( WCHAR *) pbValue); break ; case WMT_TYPE_BINARY: printf ( "<binary value>\n\n" ); break ; case WMT_TYPE_BOOL: printf ( "%s\n\n" , (( BOOL ) *pbValue == TRUE) ? "True" : "False" ); break ; case WMT_TYPE_GUID: printf ( "<GUID value>\n\n" , ( DWORD ) *pbValue); break ; } // Release allocated memory for the next pass. //次のために、割り当てられたメモリを解放 SAFE_ARRAY_DELETE(pwszName); SAFE_ARRAY_DELETE(pbValue); cchName = 0; cbValue = 0; } // for ループ終了 Exit: SAFE_ARRAY_DELETE(pwszName); SAFE_ARRAY_DELETE(pbValue); Console::ReadLine(); //入力待-ウインドウ維持 return ; } |
0 件のコメント:
コメントを投稿