--- old/src/java.desktop/windows/native/libawt/windows/ShellFolder2.cpp 2015-05-28 09:13:08.068336100 +0300 +++ new/src/java.desktop/windows/native/libawt/windows/ShellFolder2.cpp 2015-05-28 09:13:07.543231100 +0300 @@ -865,10 +865,11 @@ /* * Class: sun_awt_shell_Win32ShellFolder2 * Method: extractIcon - * Signature: (JJZ)J + * Signature: (JJZZ)J */ JNIEXPORT jlong JNICALL Java_sun_awt_shell_Win32ShellFolder2_extractIcon - (JNIEnv* env, jclass cls, jlong pIShellFolderL, jlong relativePIDL, jboolean getLargeIcon) + (JNIEnv* env, jclass cls, jlong pIShellFolderL, jlong relativePIDL, + jboolean getLargeIcon, jboolean getDefaultIcon) { IShellFolder* pIShellFolder = (IShellFolder*)pIShellFolderL; LPITEMIDLIST pidl = (LPITEMIDLIST)relativePIDL; @@ -886,7 +887,8 @@ WCHAR szBuf[MAX_PATH]; INT index; UINT flags; - hres = pIcon->GetIconLocation(GIL_FORSHELL, szBuf, MAX_PATH, &index, &flags); + UINT uFlags = getDefaultIcon ? GIL_DEFAULTICON : GIL_FORSHELL | GIL_ASYNC; + hres = pIcon->GetIconLocation(uFlags, szBuf, MAX_PATH, &index, &flags); if (SUCCEEDED(hres)) { HICON hIconLarge; hres = pIcon->Extract(szBuf, index, &hIconLarge, &hIcon, (16 << 16) + 32); @@ -898,6 +900,9 @@ fn_DestroyIcon((HICON)hIconLarge); } } + } else if (hres == E_PENDING) { + pIcon->Release(); + return E_PENDING; } pIcon->Release(); } @@ -1281,7 +1286,6 @@ JNIEXPORT jobjectArray JNICALL Java_sun_awt_shell_Win32ShellFolder2_loadKnownFolders (JNIEnv* env, jclass cls ) { - CoInitialize(NULL); IKnownFolderManager* pkfm = NULL; HRESULT hr = CoCreateInstance(CLSID_KnownFolderManager, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&pkfm));