< prev index next >

src/java.desktop/windows/native/libawt/windows/ShellFolder2.cpp

Print this page




 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 }


< prev index next >