@@ -157,6 +157,8 @@ public static string[] CommandLineToArgs(string commandLine)
157
157
}
158
158
}
159
159
160
+ private static object lockObject = new object ( ) ;
161
+
160
162
public static ( string icon , string overlay ) GetFileIconAndOverlay ( string path , int thumbnailSize , bool getOverlay = true , bool onlyGetOverlay = false )
161
163
{
162
164
string iconStr = null , overlayStr = null ;
@@ -197,24 +199,31 @@ public static (string icon, string overlay) GetFileIconAndOverlay(string path, i
197
199
}
198
200
199
201
User32 . DestroyIcon ( shfi . hIcon ) ;
200
- Shell32 . SHGetImageList ( Shell32 . SHIL . SHIL_LARGE , typeof ( ComCtl32 . IImageList ) . GUID , out var tmp ) ;
201
- using var imageList = ComCtl32 . SafeHIMAGELIST . FromIImageList ( tmp ) ;
202
- if ( imageList . IsNull || imageList . IsInvalid )
203
- {
204
- return ( iconStr , null ) ;
205
- }
206
202
207
- var overlayIdx = shfi . iIcon >> 24 ;
208
- if ( overlayIdx != 0 )
203
+ lock ( lockObject )
209
204
{
210
- var overlayImage = imageList . Interface . GetOverlayImage ( overlayIdx ) ;
211
- using var hOverlay = imageList . Interface . GetIcon ( overlayImage , ComCtl32 . IMAGELISTDRAWFLAGS . ILD_TRANSPARENT ) ;
212
- if ( ! hOverlay . IsNull && ! hOverlay . IsInvalid )
205
+ if ( ! Shell32 . SHGetImageList ( Shell32 . SHIL . SHIL_LARGE , typeof ( ComCtl32 . IImageList ) . GUID , out var imageList ) . Succeeded )
213
206
{
214
- using var image = hOverlay . ToIcon ( ) . ToBitmap ( ) ;
215
- byte [ ] bitmapData = ( byte [ ] ) new ImageConverter ( ) . ConvertTo ( image , typeof ( byte [ ] ) ) ;
216
- overlayStr = Convert . ToBase64String ( bitmapData , 0 , bitmapData . Length ) ;
207
+ return ( iconStr , null ) ;
217
208
}
209
+
210
+ var overlayIdx = shfi . iIcon >> 24 ;
211
+ if ( overlayIdx != 0 )
212
+ {
213
+ var overlayImage = imageList . GetOverlayImage ( overlayIdx ) ;
214
+ using var hOverlay = imageList . GetIcon ( overlayImage , ComCtl32 . IMAGELISTDRAWFLAGS . ILD_TRANSPARENT ) ;
215
+ if ( ! hOverlay . IsNull && ! hOverlay . IsInvalid )
216
+ {
217
+ using ( var icon = hOverlay . ToIcon ( ) )
218
+ using ( var image = icon . ToBitmap ( ) )
219
+ {
220
+ byte [ ] bitmapData = ( byte [ ] ) new ImageConverter ( ) . ConvertTo ( image , typeof ( byte [ ] ) ) ;
221
+ overlayStr = Convert . ToBase64String ( bitmapData , 0 , bitmapData . Length ) ;
222
+ }
223
+ }
224
+ }
225
+
226
+ Marshal . ReleaseComObject ( imageList ) ;
218
227
}
219
228
220
229
return ( iconStr , overlayStr ) ;
0 commit comments