2013年6月24日月曜日

ファイルの属性を取得する:GetAttributeByIndexEx

GetAttributeByIndexEx を使用してAttributeの数を取得

参考: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 件のコメント:

コメントを投稿