903 904 INT index = -1; 905 906 HRESULT hres; 907 // http://msdn.microsoft.com/library/en-us/shellcc/platform/Shell/programmersguide/shell_int/shell_int_programming/std_ifaces.asp 908 if (pIShellIcon != NULL) { 909 hres = pIShellIcon->GetIconOf(pidl, GIL_FORSHELL, &index); 910 } 911 912 return (jint)index; 913 } 914 915 916 /* 917 * Class: sun_awt_shell_Win32ShellFolder2 918 * Method: extractIcon 919 * Signature: (JJZZ)J 920 */ 921 JNIEXPORT jlong JNICALL Java_sun_awt_shell_Win32ShellFolder2_extractIcon 922 (JNIEnv* env, jclass cls, jlong pIShellFolderL, jlong relativePIDL, 923 jboolean getLargeIcon, jboolean getDefaultIcon) 924 { 925 IShellFolder* pIShellFolder = (IShellFolder*)pIShellFolderL; 926 LPITEMIDLIST pidl = (LPITEMIDLIST)relativePIDL; 927 if (pIShellFolder == NULL || pidl == NULL) { 928 return 0; 929 } 930 931 HICON hIcon = NULL; 932 933 HRESULT hres; 934 IExtractIconW* pIcon; 935 hres = pIShellFolder->GetUIObjectOf(NULL, 1, const_cast<LPCITEMIDLIST*>(&pidl), 936 IID_IExtractIconW, NULL, (void**)&pIcon); 937 if (SUCCEEDED(hres)) { 938 WCHAR szBuf[MAX_PATH]; 939 INT index; 940 UINT flags; 941 UINT uFlags = getDefaultIcon ? GIL_DEFAULTICON : GIL_FORSHELL | GIL_ASYNC; 942 hres = pIcon->GetIconLocation(uFlags, szBuf, MAX_PATH, &index, &flags); 943 if (SUCCEEDED(hres)) { 944 HICON hIconLarge; 945 hres = pIcon->Extract(szBuf, index, &hIconLarge, &hIcon, (16 << 16) + 32); 946 if (SUCCEEDED(hres)) { 947 if (getLargeIcon) { 948 fn_DestroyIcon((HICON)hIcon); 949 hIcon = hIconLarge; 950 } else { 951 fn_DestroyIcon((HICON)hIconLarge); 952 } 953 } 954 } else if (hres == E_PENDING) { 955 pIcon->Release(); 956 return E_PENDING; 957 } 958 pIcon->Release(); 959 } 960 return (jlong)hIcon; 961 } 962 963 964 /* 965 * Class: sun_awt_shell_Win32ShellFolder2 966 * Method: disposeIcon 967 * Signature: (J)V 968 */ 969 JNIEXPORT void JNICALL Java_sun_awt_shell_Win32ShellFolder2_disposeIcon 970 (JNIEnv* env, jclass cls, jlong hicon) 971 { 972 fn_DestroyIcon((HICON)hicon); 973 } | 903 904 INT index = -1; 905 906 HRESULT hres; 907 // http://msdn.microsoft.com/library/en-us/shellcc/platform/Shell/programmersguide/shell_int/shell_int_programming/std_ifaces.asp 908 if (pIShellIcon != NULL) { 909 hres = pIShellIcon->GetIconOf(pidl, GIL_FORSHELL, &index); 910 } 911 912 return (jint)index; 913 } 914 915 916 /* 917 * Class: sun_awt_shell_Win32ShellFolder2 918 * Method: extractIcon 919 * Signature: (JJZZ)J 920 */ 921 JNIEXPORT jlong JNICALL Java_sun_awt_shell_Win32ShellFolder2_extractIcon 922 (JNIEnv* env, jclass cls, jlong pIShellFolderL, jlong relativePIDL, 923 jint size, jboolean getDefaultIcon) 924 { 925 IShellFolder* pIShellFolder = (IShellFolder*)pIShellFolderL; 926 LPITEMIDLIST pidl = (LPITEMIDLIST)relativePIDL; 927 if (pIShellFolder == NULL || pidl == NULL) { 928 return 0; 929 } 930 931 HICON hIcon = NULL; 932 933 HRESULT hres; 934 IExtractIconW* pIcon; 935 hres = pIShellFolder->GetUIObjectOf(NULL, 1, const_cast<LPCITEMIDLIST*>(&pidl), 936 IID_IExtractIconW, NULL, (void**)&pIcon); 937 if (SUCCEEDED(hres)) { 938 WCHAR szBuf[MAX_PATH]; 939 INT index; 940 UINT flags; 941 UINT uFlags = getDefaultIcon ? GIL_DEFAULTICON : GIL_FORSHELL | GIL_ASYNC; 942 hres = pIcon->GetIconLocation(uFlags, szBuf, MAX_PATH, &index, &flags); 943 if (SUCCEEDED(hres)) { 944 hres = pIcon->Extract(szBuf, index, &hIcon, 0, size); 945 } else if (hres == E_PENDING) { 946 pIcon->Release(); 947 return E_PENDING; 948 } 949 pIcon->Release(); 950 } 951 return (jlong)hIcon; 952 } 953 954 955 /* 956 * Class: sun_awt_shell_Win32ShellFolder2 957 * Method: disposeIcon 958 * Signature: (J)V 959 */ 960 JNIEXPORT void JNICALL Java_sun_awt_shell_Win32ShellFolder2_disposeIcon 961 (JNIEnv* env, jclass cls, jlong hicon) 962 { 963 fn_DestroyIcon((HICON)hicon); 964 } |