#include-once #include #include #include #include #include ; #INDEX# ======================================================================== ; Title .........: IWICImagingFactory Metadata Tools ; UDF Name ......: IWICImagingMetadata.au3 ; AutoIt Version : 3.3.16.1 ; Description ...: Object-oriented UDF for reading and writing image metadata ; using IWICImagingFactory (Windows Imaging Component). ; Author(s) .....: Numeric1 ; ================================================================================ _AutoItObject_Startup() Global $oError = ObjEvent("AutoIt.Error", "_ErrFunc") Func _ErrFunc() ConsoleWrite("! COM Error ! Number: 0x" & Hex($oError.number, 8) & " ScriptLine: " & $oError.scriptline & " - " & $oError.windescription & @CRLF) Return EndFunc ;==>_ErrFunc ;############################################################################################################ ;# WIC Error Codes ;############################################################################################################ Global Const $WICERR_OK = 0x0 ; Success Global Const $WICERR_NOHWND = 0x80070006 ; Handle that is not valid Global Const $WICERR_NOPTR = 0x80004003 ; Pointer that is not valid Global Const $WICERR_NOOBJ = 0x800710D8 ; Object identifier does not represent a valid object Global Const $WICERR_PARAM = 0x80070057 ; One or more arguments are not valid Global Const $WICERR_UFAIL = 0x8000FFFF ; Unexpected failure Global Const $WICERR_OBJFAIL = 0x80080001 ; Attempt to create a class object failed ;############################################################################################################ ;# WIC Access Modes ;############################################################################################################ Global Const $WIC_GENERIC_READ = 0x80000000 ; Read access Global Const $WIC_GENERIC_WRITE = 0x40000000 ; Write access ;############################################################################################################ ;# WIC Decode Options ;############################################################################################################ Global Const $WICDecodeMetadataCacheOnDemand = 0x0 Global Const $WICDecodeMetadataCacheOnLoad = 0x1 Global Const $WICMETADATACACHEOPTION_FORCE_DWORD = 0x7FFFFFFF ;############################################################################################################ ;# WIC Bitmap Cache Options ;############################################################################################################ Global Const $WICBitmapNoCache = 0x0 Global Const $WICBitmapCacheOnDemand = 0x1 Global Const $WICBitmapCacheOnLoad = 0x2 Global Const $WICBITMAPCREATECACHEOPTION_FORCE_DWORD = 0x7FFFFFFF ;############################################################################################################ ;# WIC Bitmap Alpha Channel Options ;############################################################################################################ Global Const $WICBitmapUseAlpha = 0x0 Global Const $WICBitmapUsePremultipliedAlpha = 0x1 Global Const $WICBitmapIgnoreAlpha = 0x2 Global Const $WICBITMAPALPHACHANNELOPTIONS_FORCE_DWORD = 0x7FFFFFFF ;############################################################################################################ ;# WIC Bitmap Decoder Capabilities ;############################################################################################################ Global Const $WICBitmapDecoderCapabilitySameEncoder = 0x1 Global Const $WICBitmapDecoderCapabilityCanDecodeAllImages = 0x2 Global Const $WICBitmapDecoderCapabilityCanDecodeSomeImages = 0x4 Global Const $WICBitmapDecoderCapabilityCanEnumerateMetadata = 0x8 Global Const $WICBitmapDecoderCapabilityCanDecodeThumbnail = 0x10 ;############################################################################################################ ;# WIC Bitmap Dither Types ;############################################################################################################ Global Const $WICBitmapDitherTypeNone = 0x0 Global Const $WICBitmapDitherTypeSolid = 0x0 Global Const $WICBitmapDitherTypeOrdered4x4 = 0x1 Global Const $WICBitmapDitherTypeOrdered8x8 = 0x2 Global Const $WICBitmapDitherTypeOrdered16x16 = 0x3 Global Const $WICBitmapDitherTypeSpiral4x4 = 0x4 Global Const $WICBitmapDitherTypeSpiral8x8 = 0x5 Global Const $WICBitmapDitherTypeDualSpiral4x4 = 0x6 Global Const $WICBitmapDitherTypeDualSpiral8x8 = 0x7 Global Const $WICBitmapDitherTypeErrorDiffusion = 0x8 Global Const $WICBITMAPDITHERTYPE_FORCE_DWORD = 0x7FFFFFFF ;############################################################################################################ ;# WIC Bitmap Encoder Cache Options ;############################################################################################################ Global Const $WICBitmapEncoderCacheInMemory = 0x0 Global Const $WICBitmapEncoderCacheTempFile = 0x1 Global Const $WICBitmapEncoderNoCache = 0x2 Global Const $WICBITMAPENCODERCACHEOPTION_FORCE_DWORD = 0x7FFFFFFF ;############################################################################################################ ;# WIC Bitmap Interpolation Modes ;############################################################################################################ Global Const $WICBitmapInterpolationModeNearestNeighbor = 0x0 Global Const $WICBitmapInterpolationModeLinear = 0x1 Global Const $WICBitmapInterpolationModeCubic = 0x2 Global Const $WICBitmapInterpolationModeFant = 0x3 Global Const $WICBITMAPINTERPOLATIONMODE_FORCE_DWORD = 0x7FFFFFFF ;############################################################################################################ ;# WIC Bitmap Palette Types ;############################################################################################################ Global Const $WICBitmapPaletteTypeCustom = 0x0 Global Const $WICBitmapPaletteTypeMedianCut = 0x1 Global Const $WICBitmapPaletteTypeFixedBW = 0x2 Global Const $WICBitmapPaletteTypeFixedHalftone8 = 0x3 Global Const $WICBitmapPaletteTypeFixedHalftone27 = 0x4 Global Const $WICBitmapPaletteTypeFixedHalftone64 = 0x5 Global Const $WICBitmapPaletteTypeFixedHalftone125 = 0x6 Global Const $WICBitmapPaletteTypeFixedHalftone216 = 0x7 Global Const $WICBitmapPaletteTypeFixedWebPalette = $WICBitmapPaletteTypeFixedHalftone216 Global Const $WICBitmapPaletteTypeFixedHalftone252 = 0x8 Global Const $WICBitmapPaletteTypeFixedHalftone256 = 0x9 Global Const $WICBitmapPaletteTypeFixedGray4 = 0xA Global Const $WICBitmapPaletteTypeFixedGray16 = 0xB Global Const $WICBitmapPaletteTypeFixedGray256 = 0xC Global Const $WICBITMAPPALETTETYPE_FORCE_DWORD = 0x7FFFFFFF ;############################################################################################################ ;# WIC Bitmap Transform Options ;############################################################################################################ Global Const $WICBitmapTransformRotate0 = 0x0 Global Const $WICBitmapTransformRotate90 = 0x1 Global Const $WICBitmapTransformRotate180 = 0x2 Global Const $WICBitmapTransformRotate270 = 0x3 Global Const $WICBitmapTransformFlipHorizontal = 0x8 Global Const $WICBitmapTransformFlipVertical = 0x10 Global Const $WICBITMAPTRANSFORMOPTIONS_FORCE_DWORD = 0x7FFFFFFF ;############################################################################################################ ;# WIC Color Context Types ;############################################################################################################ Global Const $WICColorContextUninitialized = 0x0 Global Const $WICColorContextProfile = 0x1 Global Const $WICColorContextExifColorSpace = 0x2 ;############################################################################################################ ;# WIC Component Types ;############################################################################################################ Global Const $WICDecoder = 0x1 Global Const $WICEncoder = 0x2 Global Const $WICPixelFormatConverter = 0x4 Global Const $WICMetadataReader = 0x8 Global Const $WICMetadataWriter = 0x10 Global Const $WICPixelFormat = 0x20 Global Const $WICCOMPONENTTYPE_FORCE_DWORD = 0x7FFFFFFF ;############################################################################################################ ;# WIC Component Signing ;############################################################################################################ Global Const $WICComponentSigned = 0x1 Global Const $WICComponentUnsigned = 0x2 Global Const $WICComponentSafe = 0x4 Global Const $WICComponentDisabled = 0x80000000 ;############################################################################################################ ;# WIC Component Enumerate Options ;############################################################################################################ Global Const $WICComponentEnumerateDefault = 0x0 Global Const $WICComponentEnumerateRefresh = 0x1 Global Const $WICComponentEnumerateBuiltInOnly = 0x20000000 Global Const $WICComponentEnumerateUnsigned = 0x40000000 Global Const $WICComponentEnumerateDisabled = 0x80000000 ;############################################################################################################ ;# WIC Bitmap Lock Flags ;############################################################################################################ Global Const $WICBitmapLockRead = 0x1 Global Const $WICBitmapLockWrite = 0x2 ;############################################################################################################ ;# WIC Base Types ;############################################################################################################ Global Const $tagWICRect = "struct; int X; int Y; int Width; int Height; endstruct;" Global Const $tagWICBitmapPattern = "struct; uint64 Position; uint Length; ptr Pattern; ptr Mask; bool EndOfStream; endstruct;" ;############################################################################################################ ;# WIC CLSIDs ;############################################################################################################ ; Decoders Global Const $sCLSID_WICBmpDecoder = "{6b462062-7cbf-400d-9fdb-813dd10f2778}" Global Const $sCLSID_WICPngDecoder = "{389ea17b-5078-4cde-b6ef-25c15175c751}" Global Const $sCLSID_WICIcoDecoder = "{c61bfcdf-2e0f-4aad-a8d7-e06bafebcdfe}" Global Const $sCLSID_WICJpegDecoder = "{9456a480-e88b-43ea-9e73-0b2d9b71b1ca}" Global Const $sCLSID_WICGifDecoder = "{381dda3c-9ce9-4834-a23e-1f98f8fc52be}" Global Const $sCLSID_WICTiffDecoder = "{b54e85d9-fe23-499f-8b88-6acea713752b}" Global Const $sCLSID_WICWmpDecoder = "{a26cec36-234c-4950-ae16-e34aace71d0d}" ; Encoders Global Const $sCLSID_WICBmpEncoder = "{69be8bb4-d66d-47c8-865a-ed1589433782}" Global Const $sCLSID_WICPngEncoder = "{27949969-876a-41d7-9447-568f6a35a4dc}" Global Const $sCLSID_WICJpegEncoder = "{1a34f5c1-4a5a-46dc-b644-1f4567e7a676}" Global Const $sCLSID_WICGifEncoder = "{114f5598-0b22-40a0-86a1-c83ea495adbd}" Global Const $sCLSID_WICTiffEncoder = "{0131be10-2001-4c5f-a9b0-cc88fab64ce8}" Global Const $sCLSID_WICWmpEncoder = "{ac4ce3cb-e1c1-44cd-8215-5a1665509ec2}" ; Other Global Const $sCLSID_WICImagingFactory = "{cacaf262-9370-4615-a13b-9f5539da4c0a}" Global Const $sCLSID_WICDefaultFormatConverter = "{1a3f11dc-b514-4b17-8c5f-2154513852f1}" ;############################################################################################################ ;# WIC Container Format GUIDs ;############################################################################################################ Global Const $sGUID_ContainerFormatBmp = "{0af1d87e-fcfe-4188-bdeb-a7906471cbe3}" Global Const $sGUID_ContainerFormatPng = "{1b7cfaf4-713f-473c-bbcd-6137425faeaf}" Global Const $sGUID_ContainerFormatIco = "{a3a860c4-338f-4c17-919a-fba4b5628f21}" Global Const $sGUID_ContainerFormatJpeg = "{19e4a5aa-5662-4fc5-a0c0-1758028e1057}" Global Const $sGUID_ContainerFormatTiff = "{163bcc30-e2e9-4f0b-961d-a3e9fdb788a3}" Global Const $sGUID_ContainerFormatGif = "{1f8a5601-7d4d-4cbd-9c82-1bc8d4eeb9a5}" Global Const $sGUID_ContainerFormatWmp = "{57a37caa-367a-4540-916b-f183c5093a4b}" ;############################################################################################################ ;# WIC Vendor and Category GUIDs ;############################################################################################################ Global Const $sGUID_VendorMicrosoft = "{f0e749ca-edef-4589-a73a-ee0e626a2a2b}" Global Const $sCATID_WICBitmapDecoders = "{7ed96837-96f0-4812-b211-f13c24117ed3}" Global Const $sCATID_WICBitmapEncoders = "{ac757296-3522-4e11-9862-c17be5a1767e}" Global Const $sCATID_WICFormatConverters = "{7835eae8-bf14-49d1-93ce-533a407b2248}" ;############################################################################################################ ;# WIC Pixel Format GUIDs ;############################################################################################################ Global Const $sGUID_WICPixelFormatDontCare = "{6fddc324-4e03-4bfe-b185-3d77768dc900}" Global Const $sGUID_WICPixelFormat1bppIndexed = "{6fddc324-4e03-4bfe-b185-3d77768dc901}" Global Const $sGUID_WICPixelFormat2bppIndexed = "{6fddc324-4e03-4bfe-b185-3d77768dc902}" Global Const $sGUID_WICPixelFormat4bppIndexed = "{6fddc324-4e03-4bfe-b185-3d77768dc903}" Global Const $sGUID_WICPixelFormat8bppIndexed = "{6fddc324-4e03-4bfe-b185-3d77768dc904}" Global Const $sGUID_WICPixelFormatBlackWhite = "{6fddc324-4e03-4bfe-b185-3d77768dc905}" Global Const $sGUID_WICPixelFormat2bppGray = "{6fddc324-4e03-4bfe-b185-3d77768dc906}" Global Const $sGUID_WICPixelFormat4bppGray = "{6fddc324-4e03-4bfe-b185-3d77768dc907}" Global Const $sGUID_WICPixelFormat8bppGray = "{6fddc324-4e03-4bfe-b185-3d77768dc908}" Global Const $sGUID_WICPixelFormat16bppGray = "{6fddc324-4e03-4bfe-b185-3d77768dc90b}" Global Const $sGUID_WICPixelFormat16bppBGR555 = "{6fddc324-4e03-4bfe-b185-3d77768dc909}" Global Const $sGUID_WICPixelFormat16bppBGR565 = "{6fddc324-4e03-4bfe-b185-3d77768dc90a}" Global Const $sGUID_WICPixelFormat16bppBGRA5551 = "{05ec7c2b-f1e6-4961-ad46-e1cc810a87d2}" Global Const $sGUID_WICPixelFormat24bppBGR = "{6fddc324-4e03-4bfe-b185-3d77768dc90c}" Global Const $sGUID_WICPixelFormat32bppBGR = "{6fddc324-4e03-4bfe-b185-3d77768dc90e}" Global Const $sGUID_WICPixelFormat32bppBGRA = "{6fddc324-4e03-4bfe-b185-3d77768dc90f}" Global Const $sGUID_WICPixelFormat32bppPBGRA = "{6fddc324-4e03-4bfe-b185-3d77768dc910}" Global Const $sGUID_WICPixelFormat48bppRGB = "{6fddc324-4e03-4bfe-b185-3d77768dc915}" Global Const $sGUID_WICPixelFormat64bppRGBA = "{6fddc324-4e03-4bfe-b185-3d77768dc916}" Global Const $sGUID_WICPixelFormat64bppPRGBA = "{6fddc324-4e03-4bfe-b185-3d77768dc917}" Global Const $sGUID_WICPixelFormat32bppCMYK = "{6fddc324-4e03-4fbe-b185-3d77768dc91c}" ;############################################################################################################ ;# WIC Interface IIDs ;############################################################################################################ Global Const $sIID_IWICStreamProvider = "{449494BC-B468-4927-96D7-BA90D31AB505}" Global Const $sIID_IWICProgressiveLevelControl = "{DAAC296F-7AA5-4dbf-8D15-225C5976F891}" Global Const $sIID_IWICProgressCallback = "{4776F9CD-9517-45FA-BF24-E89C5EC5C60C}" Global Const $sIID_IWICComponentInfo = "{23BC3F0A-698B-4357-886B-F24D50671334}" Global Const $sIID_IWICPixelFormatInfo = "{E8EDA601-3D48-431a-AB44-69059BE88BBE}" Global Const $sIID_IWICPixelFormatInfo2 = "{A9DB33A2-AF5F-43C7-B679-74F5984B5AA4}" Global Const $sIID_IWICPersistStream = "{00675040-6908-45F8-86A3-49C7DFD6D9AD}" Global Const $sIID_IWICPalette = "{00000040-a8f2-4877-ba0a-fd2b6645fb94}" Global Const $sIID_IWICMetadataHandlerInfo = "{ABA958BF-C672-44D1-8D61-CE6DF2E682C2}" Global Const $sIID_IWICMetadataWriterInfo = "{B22E3FBA-3925-4323-B5C1-9EBFC430F236}" Global Const $sIID_IWICMetadataReader = "{9204FE99-D8FC-4FD5-A001-9536B067A899}" Global Const $sIID_IWICMetadataWriter = "{F7836E16-3BE0-470B-86BB-160D0AECD7DE}" Global Const $sIID_IWICMetadataReaderInfo = "{EEBF1F5B-07C1-4447-A3AB-22ACAF78A804}" Global Const $sIID_IWICMetadataQueryReader = "{30989668-E1C9-4597-B395-458EEDB808DF}" Global Const $sIID_IWICMetadataQueryWriter = "{A721791A-0DEF-4d06-BD91-2118BF1DB10B}" Global Const $sIID_IWICMetadataBlockReader = "{FEAA2A8D-B3F3-43E4-B25C-D1DE990A1AE1}" Global Const $sIID_IWICFormatConverterInfo = "{9F34FB65-13F4-4f15-BC57-3726B5E53D9F}" Global Const $sIID_IWICMetadataBlockWriter = "{08FB9676-B444-41E8-8DBE-6A53A542BFF1}" Global Const $sIID_IWICFastMetadataEncoder = "{B84E2C09-78C9-4AC4-8BD3-524AE1663A2F}" Global Const $sIID_IWICEnumMetadataItem = "{DC2BB46D-3F07-481E-8625-220C4AEDBB33}" Global Const $sIID_IWICDevelopRawNotificationCallback = "{95c75a6e-3e8c-4ec2-85a8-aebcc551e59b}" Global Const $sIID_IWICBitmapSource = "{00000120-a8f2-4877-ba0a-fd2b6645fb94}" Global Const $sIID_IWICBitmapFrameDecode = "{3B16811B-6A43-4ec9-A813-3D930C13B940}" Global Const $sIID_IWICDevelopRaw = "{fbec5e44-f7be-4b65-b7f8-c0c81fef026d}" Global Const $sIID_IWICImagingFactory = "{ec5ec8a9-c395-4314-9c77-54d7a935ff70}" Global Const $sIID_IWICComponentFactory = "{412D0C3A-9650-44FA-AF5B-DD2A06C8E8FB}" Global Const $sIID_IWICColorTransform = "{B66F034F-D0E2-40ab-B436-6DE39E321A94}" Global Const $sIID_IWICColorContext = "{3C613A02-34B2-44ea-9A7C-45AEA9C6FD6D}" Global Const $sIID_IWICBitmapSourceTransform = "{3B16811B-6A43-4ec9-B713-3D5A0C13B940}" Global Const $sIID_IWICBitmapCodecInfo = "{E87A44C4-B76E-4c47-8B09-298EB12A2714}" Global Const $sIID_IWICBitmapScaler = "{00000302-a8f2-4877-ba0a-fd2b6645fb94}" Global Const $sIID_IWICBitmapLock = "{00000123-a8f2-4877-ba0a-fd2b6645fb94}" Global Const $sIID_IWICBitmapFrameEncode = "{00000105-a8f2-4877-ba0a-fd2b6645fb94}" Global Const $sIID_IWICBitmapFlipRotator = "{5009834F-2D6A-41ce-9E1B-17C5AFF7A782}" Global Const $sIID_IWICBitmapEncoderInfo = "{94C9B4EE-A09F-4f92-8A1E-4A9BCE7E76FB}" Global Const $sIID_IWICBitmapEncoder = "{00000103-a8f2-4877-ba0a-fd2b6645fb94}" Global Const $sIID_IWICBitmapDecoderInfo = "{D8CD007F-D08F-4191-9BFC-236EA7F0E4B5}" Global Const $sIID_IWICBitmapCodecProgressNotification = "{64C1024E-C3CF-4462-8078-88C2B11C46D9}" Global Const $sIID_IWICBitmapClipper = "{E4FBCF03-223D-4e81-9333-D635556DD1B5}" Global Const $sIID_IWICBitmap = "{00000121-a8f2-4877-ba0a-fd2b6645fb94}" Global Const $sIID_IWICBitmapDecoder = "{9EDDE9E7-8DEE-47ea-99DF-E6FAF2ED44BF}" Global Const $sIID_IWICFormatConverter = "{00000301-a8f2-4877-ba0a-fd2b6645fb94}" Global Const $sIID_IWICStream = "{135FF860-22B7-4ddf-B0F6-218F4F299A43}" Global Const $sIID_IPropertyBag2 = "{22F55882-280B-11d0-A8A9-00A0C90C2004}" ;############################################################################################################ ;# WIC Interface Descriptions (Method Names Only) ;############################################################################################################ Global Const $tagIUnknown = "QueryInterface;AddRef;Release;" Global Const $tagIWICStreamProvider = $tagIUnknown & _ "GetStream;" & _ "GetPersistOptions;" & _ "GetPreferredVendorGUID;" & _ "RefreshStream;" Global Const $tagIEnumString = $tagIUnknown & "Next;Skip;Reset;Clone;" Global Const $tagIWICProgressiveLevelControl = $tagIUnknown & _ "GetLevelCount;" & _ "GetCurrentLevel;" & _ "SetCurrentLevel;" Global Const $tagIWICProgressCallback = $tagIUnknown & _ "Notify;" Global Const $tagIWICComponentInfo = $tagIUnknown & _ "GetComponentType;" & _ "GetCLSID;" & _ "GetSigningStatus;" & _ "GetAuthor;" & _ "GetVendorGUID;" & _ "GetVersion;" & _ "GetSpecVersion;" & _ "GetFriendlyName;" Global Const $tagIWICPixelFormatInfo = $tagIWICComponentInfo & _ "GetFormatGUID;" & _ "GetColorContext;" & _ "GetBitsPerPixel;" & _ "GetChannelCount;" & _ "GetChannelMask;" Global Const $tagIWICPixelFormatInfo2 = $tagIWICPixelFormatInfo & _ "SupportsTransparency;" & _ "GetNumericRepresentation;" Global Const $tagIWICPersistStream = $tagIUnknown & _ "GetClassID;" & _ "IsDirty;" & _ "Load;" & _ "Save;" & _ "GetSizeMax;" & _ "LoadEx;" & _ "SaveEx;" Global Const $tagIWICPalette = $tagIUnknown & _ "InitializePredefined;" & _ "InitializeCustom;" & _ "InitializeFromBitmap;" & _ "InitializeFromPalette;" & _ "GetType;" & _ "GetColorCount;" & _ "GetColors;" & _ "IsBlackWhite;" & _ "IsGrayscale;" & _ "HasAlpha;" Global Const $tagIWICMetadataHandlerInfo = $tagIWICComponentInfo & _ "GetMetadataFormat;" & _ "GetContainerFormats;" & _ "GetDeviceManufacturer;" & _ "GetDeviceModels;" & _ "DoesRequireFullStream;" & _ "DoesSupportPadding;" & _ "DoesRequireFixedSize;" Global Const $tagIWICMetadataWriterInfo = $tagIWICMetadataHandlerInfo & _ "GetHeader;" & _ "CreateInstance;" Global Const $tagIWICMetadataReader = $tagIUnknown & _ "GetMetadataFormat;" & _ "GetMetadataHandlerInfo;" & _ "GetCount;" & _ "GetValueByIndex;" & _ "GetValue;" & _ "GetEnumerator;" Global Const $tagIWICMetadataWriter = $tagIWICMetadataReader & _ "SetValue;" & _ "SetValueByIndex;" & _ "RemoveValue;" & _ "RemoveValueByIndex;" Global Const $tagIWICMetadataReaderInfo = $tagIWICMetadataHandlerInfo & _ "GetPatterns;" & _ "MatchesPattern;" & _ "CreateInstance;" Global Const $tagIWICMetadataQueryReader = $tagIUnknown & _ "GetContainerFormat;" & _ "GetLocation;" & _ "GetMetadataByName;" & _ "GetEnumerator;" Global Const $tagIWICMetadataQueryWriter = $tagIWICMetadataQueryReader & _ "SetMetadataByName;" & _ "RemoveMetadataByName;" Global Const $tagIWICMetadataBlockReader = $tagIUnknown & _ "GetContainerFormat;" & _ "GetCount;" & _ "GetReaderByIndex;" & _ "GetEnumerator;" Global Const $tagIWICFormatConverterInfo = $tagIWICComponentInfo & _ "GetPixelFormats;" & _ "CreateInstance;" Global Const $tagIWICMetadataBlockWriter = $tagIWICMetadataBlockReader & _ "InitializeFromBlockReader;" & _ "GetWriterByIndex;" & _ "AddWriter;" & _ "SetWriterByIndex;" & _ "RemoveWriterByIndex;" Global Const $tagIWICFastMetadataEncoder = $tagIUnknown & _ "Commit;" & _ "GetMetadataQueryWriter;" Global Const $tagIWICEnumMetadataItem = $tagIUnknown & _ "Next;" & _ "Skip;" & _ "Reset;" & _ "Clone;" Global Const $tagIWICDevelopRawNotificationCallback = $tagIUnknown & _ "Notify;" Global Const $tagIWICBitmapSource = $tagIUnknown & _ "GetSize;" & _ "GetPixelFormat;" & _ "GetResolution;" & _ "CopyPalette;" & _ "CopyPixels;" Global Const $tagIWICBitmapFrameDecode = $tagIWICBitmapSource & _ "GetMetadataQueryReader;" & _ "GetColorContexts;" & _ "GetThumbnail;" Global Const $tagIWICDevelopRaw = $tagIWICBitmapFrameDecode & _ "QueryRawCapabilitiesInfo;" & _ "LoadParameterSet;" & _ "GetCurrentParameterSet;" & _ "SetExposureCompensation;" & _ "GetExposureCompensation;" & _ "SetWhitePointRGB;" & _ "GetWhitePointRGB;" & _ "SetNamedWhitePoint;" & _ "GetNamedWhitePoint;" & _ "SetWhitePointKelvin;" & _ "GetWhitePointKelvin;" & _ "GetKelvinRangeInfo;" & _ "SetContrast;" & _ "GetContrast;" & _ "SetGamma;" & _ "GetGamma;" & _ "SetSharpness;" & _ "GetSharpness;" & _ "SetSaturation;" & _ "GetSaturation;" & _ "SetTint;" & _ "GetTint;" & _ "SetNoiseReduction;" & _ "GetNoiseReduction;" & _ "SetDestinationColorContext;" & _ "SetToneCurve;" & _ "GetToneCurve;" & _ "SetRotation;" & _ "GetRotation;" & _ "SetRenderMode;" & _ "GetRenderMode;" & _ "SetNotificationCallback;" Global Const $tagIWICImagingFactory = $tagIUnknown & _ "CreateDecoderFromFilename;" & _ "CreateDecoderFromStream;" & _ "CreateDecoderFromFileHandle;" & _ "CreateComponentInfo;" & _ "CreateDecoder;" & _ "CreateEncoder;" & _ "CreatePalette;" & _ "CreateFormatConverter;" & _ "CreateBitmapScaler;" & _ "CreateBitmapClipper;" & _ "CreateBitmapFlipRotator;" & _ "CreateStream;" & _ "CreateColorContext;" & _ "CreateColorTransformer;" & _ "CreateBitmap;" & _ "CreateBitmapFromSource;" & _ "CreateBitmapFromSourceRect;" & _ "CreateBitmapFromMemory;" & _ "CreateBitmapFromHBITMAP;" & _ "CreateBitmapFromHICON;" & _ "CreateComponentEnumerator;" & _ "CreateFastMetadataEncoderFromDecoder;" & _ "CreateFastMetadataEncoderFromFrameDecode;" & _ "CreateQueryWriter;" & _ "CreateQueryWriterFromReader;" Global Const $tagIWICComponentFactory = $tagIWICImagingFactory & _ "CreateMetadataReader;" & _ "CreateMetadataReaderFromContainer;" & _ "CreateMetadataWriter;" & _ "CreateMetadataWriterFromReader;" & _ "CreateQueryReaderFromBlockReader;" & _ "CreateQueryWriterFromBlockWriter;" & _ "CreateEncoderPropertyBag;" Global Const $tagIWICColorTransform = $tagIWICBitmapSource & _ "Initialize;" Global Const $tagIWICColorContext = $tagIUnknown & _ "InitializeFromFilename;" & _ "InitializeFromMemory;" & _ "InitializeFromExifColorSpace;" & _ "GetType;" & _ "GetProfileBytes;" & _ "GetExifColorSpace;" Global Const $tagIWICBitmapSourceTransform = $tagIUnknown & _ "CopyPixels;" & _ "GetClosestSize;" & _ "GetClosestPixelFormat;" & _ "DoesSupportTransform;" Global Const $tagIWICBitmapCodecInfo = $tagIWICComponentInfo & _ "GetContainerFormat;" & _ "GetPixelFormats;" & _ "GetColorManagementVersion;" & _ "GetDeviceManufacturer;" & _ "GetDeviceModels;" & _ "GetMimeTypes;" & _ "GetFileExtensions;" & _ "DoesSupportAnimation;" & _ "DoesSupportChromakey;" & _ "DoesSupportLossless;" & _ "DoesSupportMultiframe;" & _ "MatchesMimeType;" Global Const $tagIWICBitmapScaler = $tagIWICBitmapSource & _ "Initialize;" Global Const $tagIWICBitmapLock = $tagIUnknown & _ "GetSize;" & _ "GetStride;" & _ "GetDataPointer;" & _ "GetPixelFormat;" Global Const $tagIWICBitmapFrameEncode = $tagIUnknown & _ "Initialize;" & _ "SetSize;" & _ "SetResolution;" & _ "SetPixelFormat;" & _ "SetColorContexts;" & _ "SetPalette;" & _ "SetThumbnail;" & _ "WritePixels;" & _ "WriteSource;" & _ "Commit;" & _ "GetMetadataQueryWriter;" Global Const $tagIWICBitmapFlipRotator = $tagIWICBitmapSource & _ "Initialize;" Global Const $tagIWICBitmapEncoderInfo = $tagIWICBitmapCodecInfo & _ "CreateInstance;" Global Const $tagIWICBitmapEncoder = $tagIUnknown & _ "Initialize;" & _ "GetContainerFormat;" & _ "GetEncoderInfo;" & _ "SetColorContexts;" & _ "SetPalette;" & _ "SetThumbnail;" & _ "SetPreview;" & _ "CreateNewFrame;" & _ "Commit;" & _ "GetMetadataQueryWriter;" Global Const $tagIWICBitmapDecoderInfo = $tagIWICBitmapCodecInfo & _ "GetPatterns;" & _ "MatchesPattern;" & _ "CreateInstance;" Global Const $tagIWICBitmapCodecProgressNotification = $tagIUnknown & _ "RegisterProgressNotification;" Global Const $tagIWICBitmapClipper = $tagIWICBitmapSource & _ "Initialize;" Global Const $tagIWICBitmap = $tagIWICBitmapSource & _ "Lock;" & _ "SetPalette;" & _ "SetResolution;" Global Const $tagIWICBitmapDecoder = $tagIUnknown & _ "QueryCapability;" & _ "Initialize;" & _ "GetContainerFormat;" & _ "GetDecoderInfo;" & _ "CopyPalette;" & _ "GetMetadataQueryReader;" & _ "GetPreview;" & _ "GetColorContexts;" & _ "GetThumbnail;" & _ "GetFrameCount;" & _ "GetFrame;" Global Const $tagIWICFormatConverter = $tagIWICBitmapSource & _ "Initialize;" & _ "CanConvert;" Global Const $tagIWICStream = $tagIUnknown & _ "Read;" & _ "Write;" & _ "Seek;" & _ "SetSize;" & _ "CopyTo;" & _ "Commit;" & _ "Revert;" & _ "LockRegion;" & _ "UnlockRegion;" & _ "Stat;" & _ "Clone;" & _ "InitializeFromIStream;" & _ "InitializeFromFilename;" & _ "InitializeFromMemory;" & _ "InitializeFromIStreamRegion;" Global Const $tagIPropertyBag2 = $tagIUnknown & _ "Read;" & _ "Write;" & _ "CountProperties;" & _ "GetPropertyInfo;" & _ "LoadObject;" ;############################################################################################################ ;# WIC Metadata UDF ;############################################################################################################ Func __WIC_HResultOK($aResult, $vValue = $WICERR_OK) ; Check if HRESULT indicates success If Not IsArray($aResult) Then Return SetError(1, 0, 0) If $aResult[0] <> $vValue Then Return SetError(2, 0, 0) Return 1 EndFunc ;==>__WIC_HResultOK Func _WIC_ImagingFactory() ; Create a WIC Imaging Factory object with custom methods Local $oClass = _AutoItObject_Class() With $oClass .AddMethod("createFactory", "_WIC_Factory", True) ; private methode .AddMethod("createDecoderFromFileName", "_WIC_CreateDecoderFromFileName") .AddMethod("createBitmapFrameDecode", "_WIC_CreateBitmapFrameDecode") .AddMethod("getMetadataQueryReader", "_WIC_QueryReader") .AddMethod("queryMetadataByName", "_WIC_QueryMetadataByName") .AddMethod("enumerateMetaDataNames", "_WIC_EnumerateMetadataNames") .AddMethod("getMetadataQueryWriter", "_WIC_CreateQueryWriter") .AddMethod("setMetadataByName", "_WIC_QueryWriterSetMetadaByName") EndWith Return $oClass.Object EndFunc ;==>_WIC_ImagingFactory Func _WIC_Factory($oSelf) ; Retrieve the WIC Imaging Factory instance Local Static $oFactory = _AutoItObject_ObjCreate($sCLSID_WICImagingFactory, _ $sIID_IWICImagingFactory, $tagIWICImagingFactory) Return $oFactory EndFunc ;==>_WIC_Factory Func _WIC_CreateDecoderFromFileName($oSelf, $sFilename) ; Create a WIC decoder from a file If Not FileExists($sFilename) Then Return SetError(1, 0, 0) Local $aCall = $oSelf.createFactory().CreateDecoderFromFilename("long", _ "wstr", $sFilename, _ "ptr", 0, _ "dword", $WIC_GENERIC_READ, _ "dword", $WICDecodeMetadataCacheOnDemand, _ "ptr*", 0) If Not __WIC_HResultOK($aCall) Then Return SetError(2, 0, 0) Local $pDecoder = $aCall[5] If Not $pDecoder Then Return SetError(3, 0, 0) Local $oDecoder = _AutoItObject_WrapperCreate($pDecoder, $tagIWICBitmapDecoder) If Not IsObj($oDecoder) Then Return SetError(4, 0, 0) Return $oDecoder EndFunc ;==>_WIC_CreateDecoderFromFileName Func _WIC_CreateBitmapFrameDecode($oSelf, $oDecoder) ; Retrieve the first frame from a decoder If Not IsObj($oDecoder) Then Return SetError(1, 0, 0) Local $aCall = $oDecoder.GetFrameCount("long", "uint*", 0) If Not __WIC_HResultOK($aCall) Then Return SetError(2, 0, 0) Local $iFrameCount = $aCall[1] If $iFrameCount < 1 Then Return SetError(3, 0, 0) $aCall = 0 $aCall = $oDecoder.GetFrame("long", "uint", 0, "ptr*", 0) If Not __WIC_HResultOK($aCall) Then Return SetError(4, 0, 0) Local $pBitmapFrameDecode = $aCall[2] If Not $pBitmapFrameDecode Then Return SetError(5, 0, 0) Local $oBitmapFrameDecode = _AutoItObject_WrapperCreate($pBitmapFrameDecode, $tagIWICBitmapFrameDecode) If Not IsObj($oBitmapFrameDecode) Then Return SetError(6, 0, 0) Return $oBitmapFrameDecode EndFunc ;==>_WIC_CreateBitmapFrameDecode Func _WIC_QueryReader($oSelf, $oBitmapFrameDecode) ; Retrieve a metadata query reader from a bitmap frame If Not IsObj($oBitmapFrameDecode) Then Return SetError(1, 0, 0) Local $aCall = $oBitmapFrameDecode.GetMetadataQueryReader("long", "ptr*", 0) If Not __WIC_HResultOK($aCall) Then Return SetError(2, 0, 0) Local $pQueryReader = $aCall[1] If Not $pQueryReader Then Return SetError(3, 0, 0) Local $oQueryReader = _AutoItObject_WrapperCreate($pQueryReader, $tagIWICMetadataQueryReader) If Not IsObj($oQueryReader) Then SetError(4, 0, 0) Return $oQueryReader EndFunc ;==>_WIC_QueryReader Func _WIC_QueryMetadataByName($oSelf, $oQueryReader, $sQuery) ; Query metadata by name from a WIC metadata query reader If Not IsObj($oQueryReader) Then Return SetError(1, 0, 0) Local $tPropVariant = DllStructCreate($__Au3Obj_tagVARIANT) Local $pPropVariant = DllStructGetPtr($tPropVariant) _AutoItObject_VariantInit($pPropVariant) Local $aCall = $oQueryReader.GetMetadataByName("long", "wstr", $sQuery, "ptr", $pPropVariant) If Not __WIC_HResultOK($aCall) Then If IsArray($aCall) And $aCall[0] = 0x88982F40 Then ConsoleWrite("Error: The property " & $sQuery & " does not exist in the image metadata." & @CRLF) Else ConsoleWrite("Error in GetMetadataByName for " & $sQuery & ": HRESULT 0x" & Hex($aCall[0], 8) & @CRLF) EndIf Return SetError(2, 0, 0) EndIf Local $tVariant = DllStructCreate($__Au3Obj_tagVARIANT, $pPropVariant) Local $vPropvariantType = DllStructGetData($tVariant, "vt") Local $vValue, $type = "" ; Handle different variant types: _AutoItObject_VariantRead() Switch $vPropvariantType Case $__Au3Obj_VT_BSTR Return __Au3Obj_SysReadString(DllStructGetData($tVariant, "data")) Case $__Au3Obj_VT_LPWSTR Return _WinAPI_GetString(DllStructGetData($tVariant, "data")) Case $__Au3Obj_VT_LPSTR $vValue = DllStructGetData($tVariant, "data") Return DllStructGetData(DllStructCreate("char[" & __WIC_GetAnsiStrLen($vValue) + 1 & "]", DllStructGetData($tVariant, "data")), 1) Case $__Au3Obj_VT_I1, $__Au3Obj_VT_UI1 $type = "byte" Case $__Au3Obj_VT_I2 $type = "short" Case $__Au3Obj_VT_I4 $type = "int" Case $__Au3Obj_VT_I8 $type = "int64" Case $__Au3Obj_VT_UI2 $type = "word" Case $__Au3Obj_VT_UI4 $type = "uint" Case $__Au3Obj_VT_UI8 $type = "uint64" Case $__Au3Obj_VT_R4 $type = "float" Case $__Au3Obj_VT_R8 $type = "double" Case $__Au3Obj_VT_BOOL $type = "short" Case BitOR($__Au3Obj_VT_ARRAY, $__Au3Obj_VT_UI1) Local $pSafeArray = DllStructGetData($tVariant, "data") Local $bound, $pData, $lbound If 0 = __Au3Obj_SafeArrayGetUBound($pSafeArray, 1, $bound) Then __Au3Obj_SafeArrayGetLBound($pSafeArray, 1, $lbound) $bound += 1 - $lbound If 0 = __Au3Obj_SafeArrayAccessData($pSafeArray, $pData) Then Local $tData = DllStructCreate("byte[" & $bound & "]", $pData) $vValue = DllStructGetData($tData, 1) __Au3Obj_SafeArrayUnaccessData($pSafeArray) EndIf EndIf Return $vValue Case BitOR($__Au3Obj_VT_ARRAY, $__Au3Obj_VT_VARIANT) Return __Au3Obj_ReadSafeArrayVariant(DllStructGetData($tVariant, "data")) Case BitOR($__Au3Obj_VT_VECTOR, $__Au3Obj_VT_UI4) Return __WIC_ReadVector($pPropVariant) Case BitOR($__Au3Obj_VT_VECTOR, $__Au3Obj_VT_R8) Return __WIC_ReadVectorDouble($pPropVariant) Case $__Au3Obj_VT_DISPATCH Return _AutoItObject_PtrToIDispatch(DllStructGetData($tVariant, "data")) Case $__Au3Obj_VT_PTR Return DllStructGetData($tVariant, "data") Case $__Au3Obj_VT_UNKNOWN Local $pUnknown = DllStructGetData($tVariant, "data") If Not $pUnknown Then Return SetError(4, 0, 0) Local $oUnknown = _AutoItObject_WrapperCreate($pUnknown, $ltagIUnknown) If Not IsObj($oUnknown) Then Return SetError(5, 0, 0) Local $tIID_IWICMetadataQueryReader = _AutoItObject_CLSIDFromString($sIID_IWICMetadataQueryReader) Local $aResult = $oUnknown.QueryInterface("hresult", "ptr", Number(DllStructGetPtr($tIID_IWICMetadataQueryReader)), "ptr*", 0) If Not IsArray($aResult) Then Return SetError(6, 0, 0) Local $pMetadataReader = $aResult[2] If Not $pMetadataReader Then Return SetError(7, 0, 0) Local $oSubQueryReader = _AutoItObject_WrapperCreate($pMetadataReader, $tagIWICMetadataQueryReader) If Not IsObj($oSubQueryReader) Then Return SetError(8, 0, 0) ; Debugging: Enumerate sub-metadata names Local $aSubNames = _WIC_EnumerateMetadataNames($oSelf, $oSubQueryReader) If @error Then ConsoleWrite("Warning: Failed to enumerate sub-metadata for " & $sQuery & @CRLF) Else ConsoleWrite("Sub-metadata for " & $sQuery & ": " & @CRLF) For $i = 0 To UBound($aSubNames) - 1 ConsoleWrite(" " & $aSubNames[$i] & @CRLF) Next EndIf Return $oSubQueryReader Case $__Au3Obj_VT_EMPTY $vValue = "" Case $__Au3Obj_VT_ERROR Return Default Case $__Au3Obj_VT_CLSID Return _WinAPI_StringFromGUID(DllStructCreate($tagGUID, DllStructGetData($tVariant, "data"))) Case $__Au3Obj_VT_FILETIME Local $tFileTime = DllStructCreate($tagFILETIME, DllStructGetData($tVariant, "data")) Return _Date_Time_FileTimeToStr($tFileTime) Case Else ConsoleWrite("Error: Unsupported variant type " & $vPropvariantType & " for " & $sQuery & @CRLF) Return SetError(9, 0, '') EndSwitch ; Read scalar types if not already handled Local $tData = DllStructCreate($type, DllStructGetPtr($tVariant, "data")) Switch $vPropvariantType Case $__Au3Obj_VT_BOOL Return DllStructGetData($tData, 1) <> 0 EndSwitch $vValue = DllStructGetData($tData, 1) Return $vValue EndFunc ;==>_WIC_QueryMetadataByName Func _WIC_CreateQueryWriter($oSelf, $sFilename) If Not FileExists($sFilename) Then Return SetError(1, 0, 0) Local $oDecoder = $oSelf.createDecoderFromFileName($sFilename) If Not IsObj($oDecoder) Then Return SetError(2, 0, 0) Local $aCall = $oDecoder.GetFrame("long", "uint", 0, "ptr*", 0) If Not __WIC_HResultOK($aCall) Then $oDecoder = 0 Return SetError(3, $aCall[0], 0) EndIf Local $pBitmapFrameDecode = $aCall[2] If Not $pBitmapFrameDecode Then $oDecoder = 0 ; Libérer le décodeur Return SetError(4, 0, 0) EndIf ; Créer un wrapper pour la frame (optionnel, selon besoin) Local $oBitmapFrameDecode = _AutoItObject_WrapperCreate($pBitmapFrameDecode, $tagIWICBitmapFrameDecode) If Not IsObj($oBitmapFrameDecode) Then $oDecoder = 0 ; Libérer le décodeur Return SetError(4, 0, 0) EndIf ; Créer l'encodeur rapide de métadonnées $aCall = $oSelf.createFactory().CreateFastMetadataEncoderFromFrameDecode("long", "ptr", $pBitmapFrameDecode, "ptr*", 0) If Not __WIC_HResultOK($aCall) Then $oBitmapFrameDecode = 0 ; Libérer la frame $oDecoder = 0 ; Libérer le décodeur Return SetError(5, $aCall[0], 0) EndIf ; Vérifier le pointeur de l'encodeur rapide Local $pFastMetadataEncoder = $aCall[2] If Not $pFastMetadataEncoder Then $oBitmapFrameDecode = 0 ; Libérer la frame $oDecoder = 0 ; Libérer le décodeur Return SetError(6, 0, 0) EndIf ; Créer un wrapper pour l'encodeur rapide Local $oFastMetadataEncoder = _AutoItObject_WrapperCreate($pFastMetadataEncoder, $tagIWICFastMetadataEncoder) If Not IsObj($oFastMetadataEncoder) Then $oBitmapFrameDecode = 0 ; Libérer la frame $oDecoder = 0 ; Libérer le décodeur Return SetError(7, 0, 0) EndIf $aCall = $oFastMetadataEncoder.GetMetadataQueryWriter("long", "ptr*", 0) If Not __WIC_HResultOK($aCall) Then $oFastMetadataEncoder = 0 $oBitmapFrameDecode = 0 $oDecoder = 0 Return SetError(8, $aCall[0], 0) EndIf Local $pQueryWriter = $aCall[1] If Not $pQueryWriter Then $oFastMetadataEncoder = 0 $oBitmapFrameDecode = 0 $oDecoder = 0 Return SetError(9, 0, 0) EndIf Local $oQueryWriter = _AutoItObject_WrapperCreate($pQueryWriter, $tagIWICMetadataQueryWriter) If Not IsObj($oQueryWriter) Then $oFastMetadataEncoder = 0 $oBitmapFrameDecode = 0 $oDecoder = 0 Return SetError(10, 0, 0) EndIf $oFastMetadataEncoder = 0 $oBitmapFrameDecode = 0 $oDecoder = 0 Return $oQueryWriter EndFunc ;==>_WIC_CreateQueryWriter Func _WIC_QueryWriterSetMetadaByName($oSelf, $oQueryWriter, $sQuery, $pPropVariant) If Not IsObj($oQueryWriter) Then Return SetError(1, 0, 0) Local $aCall = $oQueryWriter.SetMetadataByName("long", "wstr", $sQuery, "ptr", $pPropVariant) If Not __WIC_HResultOK($aCall) Then Return SetError(2, 0, 0) ; Return 1 EndFunc ;==>_WIC_QueryWriterSetMetadaByName Func __WIC_ReadVector($pVariant) ; Read a vector of unsigned integers from a PROPVARIANT Local $tVariant = DllStructCreate($__Au3Obj_tagVARIANT, $pVariant) Local $vPropvariantType = DllStructGetData($tVariant, "vt") If BitAND($vPropvariantType, $__Au3Obj_VT_VECTOR) Then Local $tVector = DllStructCreate("uint cElems; ptr pElems", DllStructGetPtr($tVariant, "caul")) Local $cElems = DllStructGetData($tVector, "cElems") Local $pElems = DllStructGetData($tVector, "pElems") Local $aResult[$cElems] If $vPropvariantType = BitOR($__Au3Obj_VT_VECTOR, $__Au3Obj_VT_UI4) Then Local $tElems = DllStructCreate("uint[" & $cElems & "]", $pElems) For $i = 1 To $cElems $aResult[$i - 1] = DllStructGetData($tElems, 1, $i) Next Return $aResult EndIf EndIf Return SetError(1, 0, 0) EndFunc ;==>__WIC_ReadVector Func __WIC_ReadVectorDouble($pVariant) ; Read a vector of doubles from a PROPVARIANT Local $tVariant = DllStructCreate($__Au3Obj_tagVARIANT, $pVariant) Local $vPropvariantType = DllStructGetData($tVariant, "vt") If BitAND($vPropvariantType, $__Au3Obj_VT_VECTOR) Then Local $tVector = DllStructCreate("uint cElems; ptr pElems", DllStructGetPtr($tVariant, "cadbl")) Local $cElems = DllStructGetData($tVector, "cElems") Local $pElems = DllStructGetData($tVector, "pElems") Local $aResult[$cElems] If $vPropvariantType = BitOR($__Au3Obj_VT_VECTOR, $__Au3Obj_VT_R8) Then Local $tElems = DllStructCreate("double[" & $cElems & "]", $pElems) For $i = 1 To $cElems $aResult[$i - 1] = DllStructGetData($tElems, 1, $i) Next Return $aResult EndIf EndIf Return SetError(1, 0, 0) EndFunc ;==>__WIC_ReadVectorDouble Func _WIC_EnumerateMetadataNames($oSelf, $oQueryReader) ; Enumerate metadata names from a query reader If Not IsObj($oQueryReader) Then Return SetError(1, 0, 0) Local $aCall = $oQueryReader.GetEnumerator("long", "ptr*", 0) If Not __WIC_HResultOK($aCall) Then ConsoleWrite("Error: Failed to obtain string enumerator: " & @CRLF) Return SetError(2, 0, 0) EndIf Local $pEnum = $aCall[1] If Not $pEnum Then Return SetError(3, 0, 0) Local $oEnum = _AutoItObject_WrapperCreate($pEnum, $tagIEnumString) If Not IsObj($oEnum) Then $oEnum = 0 Return SetError(4, 0, 0) EndIf Local $aNames[0] Local $tString = DllStructCreate("ptr") Local $pString = DllStructGetPtr($tString) While 1 $aCall = $oEnum.Next("long", "ulong", 1, "ptr*", 0, "ulong*", 0) If Not __WIC_HResultOK($aCall) Or $aCall[2] = 0 Then ExitLoop Local $pString = $aCall[2] Local $iElement = $aCall[3] If Not $pString Or Not $iElement Then ExitLoop Local $sName = _WinAPI_GetString($pString) _WinAPI_CoTaskMemFree($pString) ReDim $aNames[UBound($aNames) + 1] $aNames[UBound($aNames) - 1] = $sName WEnd $oEnum = 0 Return $aNames EndFunc ;==>_WIC_EnumerateMetadataNames Func _WIC_EnumerateMetadata($oQueryReader) ; Enumerate metadata items from a query reader If Not IsObj($oQueryReader) Then Return SetError(1, 0, 0) Local $aMetadata[0][3] ; Array for [Schema, ID, Value] Local $aCall = $oQueryReader.GetEnumerator("long", "ptr*", 0) If Not __WIC_HResultOK($aCall) Then ConsoleWrite("Error: Failed to obtain metadata enumerator: " & Hex($aCall[0], 8) & @CRLF) Return SetError(2, 0, 0) EndIf Local $pEnum = $aCall[1] If Not $pEnum Then Return SetError(3, 0, 0) Local $oEnum = _AutoItObject_WrapperCreate($pEnum, $tagIWICEnumMetadataItem) If Not IsObj($oEnum) Then $oEnum = 0 Return SetError(4, 0, 0) EndIf Local $tSchema = DllStructCreate($__Au3Obj_tagVARIANT) Local $tId = DllStructCreate($__Au3Obj_tagVARIANT) Local $tValue = DllStructCreate($__Au3Obj_tagVARIANT) Local $pSchema = DllStructGetPtr($tSchema) Local $pId = DllStructGetPtr($tId) Local $pValue = DllStructGetPtr($tValue) _AutoItObject_VariantInit($pSchema) _AutoItObject_VariantInit($pId) _AutoItObject_VariantInit($pValue) Local $iCount = 0 While 1 $aCall = $oEnum.Next("long", "ulong", 1, "ptr", $pSchema, "ptr", $pId, "ptr", $pValue, "ulong*", 0) If Not __WIC_HResultOK($aCall) Or $aCall[5] = 0 Then ExitLoop Local $vSchema = _AutoItObject_VariantRead($pSchema) If @error Then ConsoleWrite("Error: Failed to read Schema at index " & $iCount & @CRLF) _AutoItObject_VariantClear($pSchema) _AutoItObject_VariantClear($pId) _AutoItObject_VariantClear($pValue) ContinueLoop EndIf Local $vId = _AutoItObject_VariantRead($pId) If @error Then ConsoleWrite("Error: Failed to read ID at index " & $iCount & @CRLF) _AutoItObject_VariantClear($pSchema) _AutoItObject_VariantClear($pId) _AutoItObject_VariantClear($pValue) ContinueLoop EndIf Local $vValue = _AutoItObject_VariantRead($pValue) If @error Then ConsoleWrite("Error: Failed to read Value at index " & $iCount & @CRLF) _AutoItObject_VariantClear($pSchema) _AutoItObject_VariantClear($pId) _AutoItObject_VariantClear($pValue) ContinueLoop EndIf ReDim $aMetadata[UBound($aMetadata) + 1][3] $aMetadata[$iCount][0] = $vSchema $aMetadata[$iCount][1] = $vId $aMetadata[$iCount][2] = $vValue _AutoItObject_VariantClear($pSchema) _AutoItObject_VariantClear($pId) _AutoItObject_VariantClear($pValue) $iCount += 1 WEnd _AutoItObject_VariantClear($pSchema) _AutoItObject_VariantClear($pId) _AutoItObject_VariantClear($pValue) $oEnum = 0 Return $aMetadata EndFunc ;==>_WIC_EnumerateMetadata Func __WIC_GetAnsiStrLen($pStr) Local $i = 0 While DllStructGetData(DllStructCreate("byte", $pStr + $i), 1) <> 0 $i += 1 WEnd Return $i EndFunc ;==>__WIC_GetAnsiStrLen