< prev index next >
src/java.desktop/windows/native/libawt/windows/ShellFolder2.cpp
Print this page
@@ -863,14 +863,15 @@
/*
* 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;
if (pIShellFolder == NULL || pidl == NULL) {
return 0;
@@ -884,11 +885,12 @@
IID_IExtractIconW, NULL, (void**)&pIcon);
if (SUCCEEDED(hres)) {
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);
if (SUCCEEDED(hres)) {
if (getLargeIcon) {
@@ -896,10 +898,13 @@
hIcon = hIconLarge;
} else {
fn_DestroyIcon((HICON)hIconLarge);
}
}
+ } else if (hres == E_PENDING) {
+ pIcon->Release();
+ return E_PENDING;
}
pIcon->Release();
}
return (jlong)hIcon;
}
@@ -1279,11 +1284,10 @@
* Signature: (V)[BLsun/awt/shell/Win32ShellFolder2$KnownfolderDefenition;
*/
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));
if (!SUCCEEDED(hr)) return NULL;
< prev index next >