예제 #1
0
// @pymethod |PyIExtractIconW|GetIconLocation|Description of GetIconLocation.
PyObject *PyIExtractIconW::GetIconLocation(PyObject *self, PyObject *args)
{
	IExtractIconW *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;
	WCHAR *buf = (WCHAR *)malloc(cchMax * sizeof(WCHAR));
	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_IExtractIconW );
	}
	PyObject *retStr = PyWinObject_FromWCHAR(buf);
	free(buf);
	return Py_BuildValue("iNii", hr, retStr, iIndex, flags);
}
예제 #2
0
// @pymethod |PyIExtractIconW|Extract|Description of Extract.
PyObject *PyIExtractIconW::Extract(PyObject *self, PyObject *args)
{
	IExtractIconW *pIEI = GetI(self);
	if ( pIEI == NULL )
		return NULL;
	// @pyparm <o unicode>|pszFile||Description for pszFile
	// @pyparm int|nIconIndex||Description for nIconIndex
	// @pyparm int|nIconSize||Description for nIconIndex
	HICON hiconLarge;
	HICON hiconSmall;
	PyObject *obpszFile;
	WCHAR *pszFile;
	UINT nIconIndex;
	UINT nIconSize;
	if ( !PyArg_ParseTuple(args, "Oii:Extract", &obpszFile, &nIconIndex, &nIconSize) )
		return NULL;
	BOOL bPythonIsHappy = TRUE;
	if (!PyWinObject_AsWCHAR(obpszFile, &pszFile)) bPythonIsHappy = FALSE;
	if (!bPythonIsHappy) return NULL;
	HRESULT hr;
	PY_INTERFACE_PRECALL;
	hr = pIEI->Extract( pszFile, nIconIndex, &hiconLarge, &hiconSmall, nIconSize );
	PyWinObject_FreeWCHAR(pszFile);
	PY_INTERFACE_POSTCALL;
	if ( FAILED(hr) )
		return PyCom_BuildPyException(hr, pIEI, IID_IExtractIconW );
	if (hr==S_FALSE)
		return Py_BuildValue("OO", Py_None, Py_None);
	return Py_BuildValue("NN", PyWinLong_FromHANDLE(hiconLarge),
			           PyWinLong_FromHANDLE(hiconSmall));
	// @rdesc The result is (hicon_large, hicon_small), or
	// (None,None) if the underlying function returns S_FALSE, indicating
	// the calling application should extract it.
}
예제 #3
0
/**************************************************************************
*  IExtractIconA_Constructor
*/
IExtractIconA* IExtractIconA_Constructor(LPCITEMIDLIST pidl)
{
    IExtractIconW *extractIconW;
    IExtractIconA *extractIconA;
    HRESULT hr;

    extractIconW = IExtractIconW_Constructor(pidl);
    if (!extractIconW)
        return NULL;

    hr = extractIconW->QueryInterface(IID_PPV_ARG(IExtractIconA, &extractIconA));
    extractIconW->Release();
    if (FAILED(hr))
        return NULL;
    return extractIconA;
}
예제 #4
0
/*
 * 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;
    }

    HICON hIcon = NULL;

    HRESULT hres;
    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();
    }
    return (jlong)hIcon;
}