- Timestamp:
- Dec 4, 2015, 8:49:11 AM (8 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Utilities/MediaFoundation/EnumerateTransforms/Application.cpp
r445 r548 7 7 8 8 #include "stdafx.h" 9 #include <mfapi.h>10 #include <mftransform.h>11 9 #include "rodshow.h" 12 13 #pragma comment(lib, "mfplat.lib") 14 #pragma comment(lib, "mfuuid.lib") 10 #include "romf.h" 15 11 16 12 //////////////////////////////////////////////////////////// … … 21 17 { 22 18 public: 23 static CString FormatKey(const GUID& Key)24 {25 static const struct { const GUID* pIdentifier; LPCSTR pszName; } g_pMap[] =26 {27 #define A(x) { &x, #x },28 // NOTE: 1. Find all "DECLSPEC_SELECTANY GUID" or "DEFINE_GUID"29 // 2. Replace ^.+DECLSPEC_SELECTANY GUID ([A-z0-9_]+).+\r?$ -> A($1)30 // Windows SDK 8.1; mfapi.h31 A(MF_EVENT_SESSIONCAPS)32 A(MF_EVENT_SESSIONCAPS_DELTA)33 A(MF_EVENT_TOPOLOGY_STATUS)34 A(MF_EVENT_START_PRESENTATION_TIME)35 A(MF_EVENT_PRESENTATION_TIME_OFFSET)36 A(MF_EVENT_START_PRESENTATION_TIME_AT_OUTPUT)37 A(MF_EVENT_SOURCE_FAKE_START)38 A(MF_EVENT_SOURCE_PROJECTSTART)39 A(MF_EVENT_SOURCE_ACTUAL_START)40 A(MF_EVENT_SOURCE_TOPOLOGY_CANCELED)41 A(MF_EVENT_SOURCE_CHARACTERISTICS)42 A(MF_EVENT_SOURCE_CHARACTERISTICS_OLD)43 A(MF_EVENT_DO_THINNING)44 A(MF_EVENT_SCRUBSAMPLE_TIME)45 A(MF_EVENT_OUTPUT_NODE)46 A(MF_EVENT_MFT_INPUT_STREAM_ID)47 A(MF_EVENT_MFT_CONTEXT)48 A(MF_EVENT_STREAM_METADATA_KEYDATA)49 A(MF_EVENT_STREAM_METADATA_CONTENT_KEYIDS)50 A(MF_EVENT_STREAM_METADATA_SYSTEMID)51 A(MFSampleExtension_CleanPoint)52 A(MFSampleExtension_Discontinuity)53 A(MFSampleExtension_Token)54 A(MFSampleExtension_DecodeTimestamp)55 A(MFSampleExtension_VideoEncodeQP)56 A(MFSampleExtension_VideoEncodePictureType)57 A(MFSampleExtension_FrameCorruption)58 A(MFSampleExtension_DescrambleData)59 A(MFSampleExtension_SampleKeyID)60 A(MFSampleExtension_GenKeyFunc)61 A(MFSampleExtension_GenKeyCtx)62 A(MFSampleExtension_PacketCrossOffsets)63 A(MFSampleExtension_Encryption_SampleID)64 A(MFSampleExtension_Encryption_KeyID)65 A(MFSampleExtension_Content_KeyID)66 A(MFSampleExtension_Encryption_SubSampleMappingSplit)67 A(MFSampleExtension_Interlaced)68 A(MFSampleExtension_BottomFieldFirst)69 A(MFSampleExtension_RepeatFirstField)70 A(MFSampleExtension_SingleField)71 A(MFSampleExtension_DerivedFromTopField)72 A(MFSampleExtension_MeanAbsoluteDifference)73 A(MFSampleExtension_LongTermReferenceFrameInfo)74 A(MFSampleExtension_ROIRectangle)75 A(MFSampleExtension_PhotoThumbnail)76 A(MFSampleExtension_PhotoThumbnailMediaType)77 A(MFSampleExtension_CaptureMetadata)78 A(MF_CAPTURE_METADATA_PHOTO_FRAME_FLASH)79 A(MFT_CATEGORY_VIDEO_DECODER)80 A(MFT_CATEGORY_VIDEO_ENCODER)81 A(MFT_CATEGORY_VIDEO_EFFECT)82 A(MFT_CATEGORY_MULTIPLEXER)83 A(MFT_CATEGORY_DEMULTIPLEXER)84 A(MFT_CATEGORY_AUDIO_DECODER)85 A(MFT_CATEGORY_AUDIO_ENCODER)86 A(MFT_CATEGORY_AUDIO_EFFECT)87 A(MFT_CATEGORY_VIDEO_PROCESSOR)88 A(MFT_CATEGORY_OTHER)89 A(MFT_SUPPORT_DYNAMIC_FORMAT_CHANGE)90 A(MFVideoFormat_H264_ES)91 A(MFVideoFormat_MPEG2)92 A(MFAudioFormat_Dolby_AC3)93 A(MFAudioFormat_Dolby_DDPlus)94 A(MFMPEG4Format_Base)95 A(MF_MT_MAJOR_TYPE)96 A(MF_MT_SUBTYPE)97 A(MF_MT_ALL_SAMPLES_INDEPENDENT)98 A(MF_MT_FIXED_SIZE_SAMPLES)99 A(MF_MT_COMPRESSED)100 A(MF_MT_SAMPLE_SIZE)101 A(MF_MT_WRAPPED_TYPE)102 A(MF_MT_VIDEO_3D)103 A(MF_MT_VIDEO_3D_FORMAT)104 A(MF_MT_VIDEO_3D_NUM_VIEWS)105 A(MF_MT_VIDEO_3D_LEFT_IS_BASE)106 A(MF_MT_VIDEO_3D_FIRST_IS_LEFT)107 A(MFSampleExtension_3DVideo)108 A(MFSampleExtension_3DVideo_SampleFormat)109 A(MF_MT_VIDEO_ROTATION)110 A(MF_MT_AUDIO_NUM_CHANNELS)111 A(MF_MT_AUDIO_SAMPLES_PER_SECOND)112 A(MF_MT_AUDIO_FLOAT_SAMPLES_PER_SECOND)113 A(MF_MT_AUDIO_AVG_BYTES_PER_SECOND)114 A(MF_MT_AUDIO_BLOCK_ALIGNMENT)115 A(MF_MT_AUDIO_BITS_PER_SAMPLE)116 A(MF_MT_AUDIO_VALID_BITS_PER_SAMPLE)117 A(MF_MT_AUDIO_SAMPLES_PER_BLOCK)118 A(MF_MT_AUDIO_CHANNEL_MASK)119 A(MF_MT_AUDIO_FOLDDOWN_MATRIX)120 A(MF_MT_AUDIO_WMADRC_PEAKREF)121 A(MF_MT_AUDIO_WMADRC_PEAKTARGET)122 A(MF_MT_AUDIO_WMADRC_AVGREF)123 A(MF_MT_AUDIO_WMADRC_AVGTARGET)124 A(MF_MT_AUDIO_PREFER_WAVEFORMATEX)125 A(MF_MT_AAC_PAYLOAD_TYPE)126 A(MF_MT_AAC_AUDIO_PROFILE_LEVEL_INDICATION)127 A(MF_MT_FRAME_SIZE)128 A(MF_MT_FRAME_RATE)129 A(MF_MT_PIXEL_ASPECT_RATIO)130 A(MF_MT_DRM_FLAGS)131 A(MF_MT_TIMESTAMP_CAN_BE_DTS)132 A(MF_MT_PAD_CONTROL_FLAGS)133 A(MF_MT_SOURCE_CONTENT_HINT)134 A(MF_MT_VIDEO_CHROMA_SITING)135 A(MF_MT_INTERLACE_MODE)136 A(MF_MT_TRANSFER_FUNCTION)137 A(MF_MT_VIDEO_PRIMARIES)138 A(MF_MT_CUSTOM_VIDEO_PRIMARIES)139 A(MF_MT_YUV_MATRIX)140 A(MF_MT_VIDEO_LIGHTING)141 A(MF_MT_VIDEO_NOMINAL_RANGE)142 A(MF_MT_GEOMETRIC_APERTURE)143 A(MF_MT_MINIMUM_DISPLAY_APERTURE)144 A(MF_MT_PAN_SCAN_APERTURE)145 A(MF_MT_PAN_SCAN_ENABLED)146 A(MF_MT_AVG_BITRATE)147 A(MF_MT_AVG_BIT_ERROR_RATE)148 A(MF_MT_MAX_KEYFRAME_SPACING)149 A(MF_MT_USER_DATA)150 A(MF_MT_DEFAULT_STRIDE)151 A(MF_MT_PALETTE)152 A(MF_MT_AM_FORMAT_TYPE)153 A(MF_MT_VIDEO_PROFILE)154 A(MF_MT_VIDEO_LEVEL)155 A(MF_MT_MPEG_START_TIME_CODE)156 A(MF_MT_MPEG2_PROFILE)157 A(MF_MT_MPEG2_LEVEL)158 A(MF_MT_MPEG2_FLAGS)159 A(MF_MT_MPEG_SEQUENCE_HEADER)160 A(MF_MT_MPEG2_STANDARD)161 A(MF_MT_MPEG2_TIMECODE)162 A(MF_MT_MPEG2_CONTENT_PACKET)163 A(MF_MT_H264_MAX_CODEC_CONFIG_DELAY)164 A(MF_MT_H264_SUPPORTED_SLICE_MODES)165 A(MF_MT_H264_SUPPORTED_SYNC_FRAME_TYPES)166 A(MF_MT_H264_RESOLUTION_SCALING)167 A(MF_MT_H264_SIMULCAST_SUPPORT)168 A(MF_MT_H264_SUPPORTED_RATE_CONTROL_MODES)169 A(MF_MT_H264_MAX_MB_PER_SEC)170 A(MF_MT_H264_SUPPORTED_USAGES)171 A(MF_MT_H264_CAPABILITIES)172 A(MF_MT_H264_SVC_CAPABILITIES)173 A(MF_MT_H264_USAGE)174 A(MF_MT_H264_RATE_CONTROL_MODES)175 A(MF_MT_H264_LAYOUT_PER_STREAM)176 A(MF_MT_DV_AAUX_SRC_PACK_0)177 A(MF_MT_DV_AAUX_CTRL_PACK_0)178 A(MF_MT_DV_AAUX_SRC_PACK_1)179 A(MF_MT_DV_AAUX_CTRL_PACK_1)180 A(MF_MT_DV_VAUX_SRC_PACK)181 A(MF_MT_DV_VAUX_CTRL_PACK)182 A(MF_MT_ARBITRARY_HEADER)183 A(MF_MT_ARBITRARY_FORMAT)184 A(MF_MT_IMAGE_LOSS_TOLERANT)185 A(MF_MT_MPEG4_SAMPLE_DESCRIPTION)186 A(MF_MT_MPEG4_CURRENT_SAMPLE_ENTRY)187 A(MF_MT_ORIGINAL_4CC)188 A(MF_MT_ORIGINAL_WAVE_FORMAT_TAG)189 A(MF_MT_FRAME_RATE_RANGE_MIN)190 A(MF_MT_FRAME_RATE_RANGE_MAX)191 A(MF_LOW_LATENCY)192 A(MF_VIDEO_MAX_MB_PER_SEC)193 A(MFMediaType_Default)194 A(MFMediaType_Audio)195 A(MFMediaType_Video)196 A(MFMediaType_Protected)197 A(MFMediaType_SAMI)198 A(MFMediaType_Script)199 A(MFMediaType_Image)200 A(MFMediaType_HTML)201 A(MFMediaType_Binary)202 A(MFMediaType_FileTransfer)203 A(MFMediaType_Stream)204 A(MFImageFormat_JPEG)205 A(MFImageFormat_RGB32)206 A(MFStreamFormat_MPEG2Transport)207 A(MFStreamFormat_MPEG2Program)208 A(AM_MEDIA_TYPE_REPRESENTATION)209 A(FORMAT_MFVideoFormat)210 A(CLSID_MFSourceResolver)211 // Windows SDK 8.1; mftransform.h212 A(MF_SA_D3D_AWARE)213 A(MF_SA_REQUIRED_SAMPLE_COUNT)214 A(MF_SA_REQUIRED_SAMPLE_COUNT_PROGRESSIVE)215 A(MF_SA_MINIMUM_OUTPUT_SAMPLE_COUNT)216 A(MF_SA_MINIMUM_OUTPUT_SAMPLE_COUNT_PROGRESSIVE)217 A(MFT_SUPPORT_3DVIDEO)218 A(MF_ENABLE_3DVIDEO_OUTPUT)219 A(MF_SA_D3D11_BINDFLAGS)220 A(MF_SA_D3D11_USAGE)221 A(MF_SA_D3D11_AWARE)222 A(MF_SA_D3D11_SHARED)223 A(MF_SA_D3D11_SHARED_WITHOUT_MUTEX)224 A(MF_SA_BUFFERS_PER_SAMPLE)225 A(MFT_DECODER_EXPOSE_OUTPUT_TYPES_IN_NATIVE_ORDER)226 A(MFT_REMUX_MARK_I_PICTURE_AS_CLEAN_POINT)227 A(MFT_DECODER_FINAL_VIDEO_RESOLUTION_HINT)228 A(MFT_ENCODER_SUPPORTS_CONFIG_EVENT)229 A(MFT_ENUM_HARDWARE_VENDOR_ID_Attribute)230 A(MF_TRANSFORM_ASYNC)231 A(MF_TRANSFORM_ASYNC_UNLOCK)232 A(MF_TRANSFORM_FLAGS_Attribute)233 A(MF_TRANSFORM_CATEGORY_Attribute)234 A(MFT_TRANSFORM_CLSID_Attribute)235 A(MFT_INPUT_TYPES_Attributes)236 A(MFT_OUTPUT_TYPES_Attributes)237 A(MFT_ENUM_HARDWARE_URL_Attribute)238 A(MFT_FRIENDLY_NAME_Attribute)239 A(MFT_CONNECTED_STREAM_ATTRIBUTE)240 A(MFT_CONNECTED_TO_HW_STREAM)241 A(MFT_PREFERRED_OUTPUTTYPE_Attribute)242 A(MFT_PROCESS_LOCAL_Attribute)243 A(MFT_PREFERRED_ENCODER_PROFILE)244 A(MFT_HW_TIMESTAMP_WITH_QPC_Attribute)245 A(MFT_FIELDOFUSE_UNLOCK_Attribute)246 A(MFT_CODEC_MERIT_Attribute)247 A(MFT_ENUM_TRANSCODE_ONLY_ATTRIBUTE)248 #undef A249 };250 for(SIZE_T nIndex = 0; nIndex < DIM(g_pMap); nIndex++)251 if(*g_pMap[nIndex].pIdentifier == Key)252 return CString(g_pMap[nIndex].pszName);253 return CString(_PersistHelper::StringFromIdentifier(Key));254 }255 19 static CString FormatTransformFlags(ULONG nTransformFlags) 256 20 { … … 288 52 public: 289 53 // CModule 290 CModule() throw() 291 { 292 _Z4(atlTraceRefcount, 4, _T("this 0x%p"), this); 54 CModule() 55 { 56 AtlTraceSetDefaultSettings(); 57 _Z4_THIS(); 293 58 _W(CExceptionFilter::Initialize()); 294 #if defined(_DEBUG) 295 AtlTraceLoadSettings(NULL); 296 #endif // defined(_DEBUG) 297 } 298 ~CModule() throw() 299 { 300 _Z4(atlTraceRefcount, 4, _T("this 0x%p"), this); 59 } 60 ~CModule() 61 { 62 _Z4_THIS(); 301 63 CExceptionFilter::Terminate(); 302 64 } … … 308 70 VOID RunMessageLoop() 309 71 { 310 static const struct { const GUID* pCategory; LPCSTR pszName; } g_pMap[] =311 { 312 #define A(x) { &x, #x },72 static const CEnumerationNameT<GUID> g_pCategoryMap[] = 73 { 74 #define A(x) { x, #x }, 313 75 A(MFT_CATEGORY_VIDEO_DECODER) 314 76 A(MFT_CATEGORY_VIDEO_ENCODER) … … 321 83 A(MFT_CATEGORY_VIDEO_PROCESSOR) 322 84 A(MFT_CATEGORY_OTHER) 85 A(CLSID_VideoInputDeviceCategory) // Kernel streaming (KS) minidriver backed hardware transforms https://msdn.microsoft.com/en-us/library/windows/desktop/ms700134#live_sources 86 A(KSCATEGORY_BRIDGE) 87 A(KSCATEGORY_CAPTURE) // Video and Audio capture stuff 88 A(KSCATEGORY_VIDEO_CAMERA) 89 A(KSCATEGORY_RENDER) 90 A(KSCATEGORY_MIXER) 91 A(KSCATEGORY_SPLITTER) 92 A(KSCATEGORY_DATACOMPRESSOR) 93 A(KSCATEGORY_DATADECOMPRESSOR) 94 A(KSCATEGORY_DATATRANSFORM) 95 A(KSCATEGORY_COMMUNICATIONSTRANSFORM) 96 A(KSCATEGORY_INTERFACETRANSFORM) 97 A(KSCATEGORY_MEDIUMTRANSFORM) 98 A(KSCATEGORY_FILESYSTEM) 99 A(KSCATEGORY_CLOCK) 100 A(KSCATEGORY_PROXY) 101 A(KSCATEGORY_QUALITY) 323 102 #undef A 324 103 }; 325 for( SIZE_T nCategoryIndex = 0; nCategoryIndex < DIM(g_pMap); nCategoryIndex++)326 { 327 _tprintf(_T("Category: %hs %ls\n"), g_pMap[nCategoryIndex].pszName, _PersistHelper::StringFromIdentifier(*g_pMap[nCategoryIndex].pCategory));104 for(auto&& CategoryItem: g_pCategoryMap) 105 { 106 _tprintf(_T("Category: %hs %ls\n"), CategoryItem.pszName, _PersistHelper::StringFromIdentifier(CategoryItem.Value)); 328 107 _tprintf(_T("\n")); 329 108 _ATLTRY 330 109 { 331 CComHeapPtr<IMFActivate*> ppMfActivates; 332 UINT32 nMfActivateCount = 0; 333 __C(MFTEnumEx(*g_pMap[nCategoryIndex].pCategory, MFT_ENUM_FLAG_ALL, NULL, NULL, &ppMfActivates, &nMfActivateCount)); 334 CRoArrayT<CComPtr<IMFActivate>> ActivateArray; 335 for(UINT32 nMfActivateIndex = 0; nMfActivateIndex < nMfActivateCount; nMfActivateIndex++) 110 MF::CActivateArray ActivateArray; 111 ActivateArray.Enumerate(CategoryItem.Value); 112 UINT nActivateIndex = 0; 113 for(auto&& pActivate: ActivateArray) 336 114 { 337 CComPtr<IMFActivate>& pMfActivate = reinterpret_cast<CComPtr<IMFActivate>&>(ppMfActivates[nMfActivateIndex]); 338 _W(ActivateArray.Add(pMfActivate) >= 0); 339 pMfActivate = NULL; 340 } 341 for(SIZE_T nActivateIndex = 0; nActivateIndex < ActivateArray.GetCount(); nActivateIndex++) 342 { 343 const CComPtr<IMFActivate>& pMfActivate = ActivateArray[nActivateIndex]; 344 CString sItem = AtlFormatString(_T("#%d"), nActivateIndex); 345 CComHeapPtr<WCHAR> pszFriendlyName; 346 UINT32 nFriendlyNameLength; 347 if(SUCCEEDED(pMfActivate->GetAllocatedString(MFT_FRIENDLY_NAME_Attribute, &pszFriendlyName, &nFriendlyNameLength))) 348 sItem.Insert(0, AtlFormatString(_T("%ls "), pszFriendlyName)); 115 CString sItem = AtlFormatString(_T("#%d"), nActivateIndex++); 116 CString sFriendlyName; 117 if(pActivate.TryGetString(MFT_FRIENDLY_NAME_Attribute, sFriendlyName)) 118 sItem.Insert(0, AtlFormatString(_T("%s "), sFriendlyName)); 349 119 _tprintf(_T("\t") _T("%s\n"), sItem); 350 120 _ATLTRY 351 121 { 352 122 UINT32 nItemCount = 0; 353 __C(p MfActivate->GetCount(&nItemCount));123 __C(pActivate->GetCount(&nItemCount)); 354 124 for(UINT32 nItemIndex = 0; nItemIndex < nItemCount; nItemIndex++) 355 125 { 356 126 GUID Key; 357 PROPVARIANT vValue; 358 PropVariantInit(&vValue); 359 __C(pMfActivate->GetItemByIndex(nItemIndex, &Key, &vValue)); 360 // NOTE: See PROPVARIANT Type Constants http://msdn.microsoft.com/en-us/library/cc235506%28v=prot.10%29.aspx 361 if(Key == MF_TRANSFORM_CATEGORY_Attribute && vValue.vt == VT_CLSID && *vValue.puuid == *g_pMap[nCategoryIndex].pCategory) 127 MF::CPropVariant vValue; 128 __C(pActivate->GetItemByIndex(nItemIndex, &Key, &vValue)); 129 // NOTE: See PROPVARIANT Type Constants http://msdn.microsoft.com/en-us/library/cc235506 130 if(Key == MF_TRANSFORM_CATEGORY_Attribute && vValue.vt == VT_CLSID && *vValue.puuid == CategoryItem.Value) 362 131 continue; // Matches Category 363 132 if(Key == MFT_FRIENDLY_NAME_Attribute) … … 373 142 bDefault = FALSE; 374 143 } else 375 if((Key == MFT_INPUT_TYPES_Attributes || Key == MFT_OUTPUT_TYPES_Attributes) && (VT_VECTOR | VT_UI1))144 if((Key == MFT_INPUT_TYPES_Attributes || Key == MFT_OUTPUT_TYPES_Attributes) && vValue.vt == (VT_VECTOR | VT_UI1)) 376 145 { 377 146 _A(!(vValue.caub.cElems % sizeof (MFT_REGISTER_TYPE_INFO))); … … 380 149 CRoArrayT<CString> Array; 381 150 for(SIZE_T nIndex = 0; nIndex < nDataCount; nIndex++) 382 _W(Array.Add(AtlFormatString(_T("\t\t\t") _T("% ls %ls"), _FilterGraphHelper::FormatMajorType(pData[nIndex].guidMajorType), _FilterGraphHelper::FormatSubtype(pData[nIndex].guidSubtype))) >= 0);151 _W(Array.Add(AtlFormatString(_T("\t\t\t") _T("%s %s"), MF::FormatKey(pData[nIndex].guidMajorType), MF::FormatKey(pData[nIndex].guidSubtype))) >= 0); 383 152 sStringValue += _StringHelper::Join(Array, _T("\n")); 384 153 if(!sStringValue.IsEmpty()) … … 395 164 if(bDefault) 396 165 { 397 if(vValue.vt == VT_LPSTR) 398 { 399 sStringValue = CA2CT(vValue.pszVal); 400 bStringValueAvailable = TRUE; 401 } else 402 if(vValue.vt == VT_LPWSTR) 403 { 404 sStringValue = CW2CT(vValue.pwszVal); 405 bStringValueAvailable = TRUE; 406 } else 407 if(vValue.vt == VT_CLSID) 408 { 409 sStringValue = _PersistHelper::StringFromIdentifier(*vValue.puuid); 410 bStringValueAvailable = TRUE; 411 } else 412 if(vValue.vt == (VT_VECTOR | VT_UI1)) 413 { 414 sStringValue = AtlFormatString(_T("%d bytes"), vValue.caub.cElems); 415 if(vValue.caub.cElems > 0) 416 { 417 sStringValue += _T(", "); 418 ULONG nIndex; 419 for(nIndex = 0; nIndex < vValue.caub.cElems && nIndex < 24; nIndex++) 420 sStringValue += AtlFormatString(_T("%02X "), vValue.caub.pElems[nIndex]); 421 if(nIndex < vValue.caub.cElems) 422 sStringValue += _T("..."); 423 } 424 bStringValueAvailable = TRUE; 425 } else 426 { 427 CComVariant vVariantValue; 428 bStringValueAvailable = SUCCEEDED(vVariantValue.ChangeType(VT_BSTR, &reinterpret_cast<VARIANT&>(vValue))); 429 if(bStringValueAvailable) 430 sStringValue = CString(vVariantValue.bstrVal); 431 } 166 sStringValue = vValue.Format(); 167 bStringValueAvailable = !sStringValue.IsEmpty(); 432 168 } 433 169 #pragma endregion 434 170 if(bStringValueAvailable) 435 _tprintf(_T("\t") _T("\t") _T("%s: %s (0x%x)\n"), FormatKey(Key), sStringValue, vValue.vt);171 _tprintf(_T("\t") _T("\t") _T("%s: %s\n"), MF::FormatKey(Key), sStringValue); 436 172 else 437 _tprintf(_T("\t") _T("\t") _T("%s: ??? (0x% x)\n"), FormatKey(Key), vValue.vt);173 _tprintf(_T("\t") _T("\t") _T("%s: ??? (0x%X)\n"), MF::FormatKey(Key), MF::CPropVariant::FormatType(vValue.vt)); 438 174 } 439 175 }
Note: See TracChangeset
for help on using the changeset viewer.