// @pymethod |PyIExtractIcon|GetIconLocation|Description of GetIconLocation. PyObject *PyIExtractIcon::GetIconLocation(PyObject *self, PyObject *args) { IExtractIconA *pIEI = GetI(self); if ( pIEI == NULL ) return NULL; // @pyparm int|uFlags||Description for uFlags // @pyparm int|cchMax|MAX_PATH+MAX_FNAME|Buffer size to allocate for file name UINT uFlags; INT cchMax = MAX_PATH + _MAX_FNAME; if ( !PyArg_ParseTuple(args, "i|i:GetIconLocation", &uFlags, &cchMax)) return NULL; char *buf = (char *)malloc(cchMax * sizeof(char)); if (!buf) return PyErr_NoMemory(); INT iIndex; UINT flags; HRESULT hr; PY_INTERFACE_PRECALL; hr = pIEI->GetIconLocation( uFlags, buf, cchMax, &iIndex, &flags); PY_INTERFACE_POSTCALL; if ( FAILED(hr) ) { free(buf); return PyCom_BuildPyException(hr, pIEI, IID_IExtractIcon ); } PyObject *retStr = PyString_FromString(buf); free(buf); return Py_BuildValue("iNii", hr, retStr, iIndex, flags); }
/* * Class: sun_awt_shell_Win32ShellFolder2 * Method: extractIcon * Signature: (JJZ)J */ JNIEXPORT jlong JNICALL Java_sun_awt_shell_Win32ShellFolder2_extractIcon (JNIEnv* env, jclass cls, jlong pIShellFolderL, jlong relativePIDL, jboolean getLargeIcon) { IShellFolder* pIShellFolder = (IShellFolder*)pIShellFolderL; LPITEMIDLIST pidl = (LPITEMIDLIST)relativePIDL; if (pIShellFolder == NULL || pidl == NULL) { return 0; } ::CoInitialize(NULL); HRESULT hres; HICON hIcon = NULL; if (IS_NT) { IExtractIconW* pIcon; hres = pIShellFolder->GetUIObjectOf(NULL, 1, const_cast<LPCITEMIDLIST*>(&pidl), 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); if (SUCCEEDED(hres)) { HICON hIconLarge; hres = pIcon->Extract(szBuf, index, &hIconLarge, &hIcon, (16 << 16) + 32); if (SUCCEEDED(hres)) { if (getLargeIcon) { fn_DestroyIcon((HICON)hIcon); hIcon = hIconLarge; } else { fn_DestroyIcon((HICON)hIconLarge); } } } pIcon->Release(); } } else { IExtractIconA* pIcon; hres = pIShellFolder->GetUIObjectOf(NULL, 1, const_cast<LPCITEMIDLIST*>(&pidl), IID_IExtractIconA, NULL, (void**)&pIcon); if (SUCCEEDED(hres)) { CHAR szBuf[MAX_PATH]; INT index; UINT flags; hres = pIcon->GetIconLocation(GIL_FORSHELL, 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) { fn_DestroyIcon((HICON)hIcon); hIcon = hIconLarge; } else { fn_DestroyIcon((HICON)hIconLarge); } } } pIcon->Release(); } } ::CoUninitialize(); return (jlong)hIcon; }