shell32: Helper function for unicode support in folder and file pidls.
This commit is contained in:
parent
b34868dffa
commit
5136f57f12
|
@ -1811,15 +1811,21 @@ DWORD _ILSimpleGetText (LPCITEMIDLIST pidl, LPSTR szOut, UINT uOutSize)
|
||||||
*/
|
*/
|
||||||
DWORD _ILSimpleGetTextW (LPCITEMIDLIST pidl, LPWSTR szOut, UINT uOutSize)
|
DWORD _ILSimpleGetTextW (LPCITEMIDLIST pidl, LPWSTR szOut, UINT uOutSize)
|
||||||
{
|
{
|
||||||
DWORD dwReturn;
|
DWORD dwReturn;
|
||||||
char szTemp[MAX_PATH];
|
char szTemp[MAX_PATH];
|
||||||
|
FileStructW *pFileStructW = _ILGetFileStructW(pidl);
|
||||||
|
|
||||||
TRACE("(%p %p %x)\n",pidl,szOut,uOutSize);
|
TRACE("(%p %p %x)\n",pidl,szOut,uOutSize);
|
||||||
|
|
||||||
dwReturn = _ILSimpleGetText(pidl, szTemp, uOutSize);
|
if (pFileStructW) {
|
||||||
|
lstrcpynW(szOut, pFileStructW->wszName, uOutSize);
|
||||||
|
dwReturn = lstrlenW(pFileStructW->wszName);
|
||||||
|
} else {
|
||||||
|
dwReturn = _ILSimpleGetText(pidl, szTemp, MAX_PATH);
|
||||||
|
|
||||||
if (!MultiByteToWideChar(CP_ACP, 0, szTemp, -1, szOut, MAX_PATH))
|
if (!MultiByteToWideChar(CP_ACP, 0, szTemp, -1, szOut, uOutSize))
|
||||||
*szOut = 0;
|
*szOut = 0;
|
||||||
|
}
|
||||||
|
|
||||||
TRACE("-- (%p=%s 0x%08lx)\n",szOut,debugstr_w(szOut),dwReturn);
|
TRACE("-- (%p=%s 0x%08lx)\n",szOut,debugstr_w(szOut),dwReturn);
|
||||||
return dwReturn;
|
return dwReturn;
|
||||||
|
@ -1938,6 +1944,45 @@ IID* _ILGetGUIDPointer(LPCITEMIDLIST pidl)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
* _ILGetFileStructW [Internal]
|
||||||
|
*
|
||||||
|
* Get pointer the a SHITEMID's FileStructW field if present
|
||||||
|
*
|
||||||
|
* PARAMS
|
||||||
|
* pidl [I] The SHITEMID
|
||||||
|
*
|
||||||
|
* RETURNS
|
||||||
|
* Success: Pointer to pidl's FileStructW field.
|
||||||
|
* Failure: NULL
|
||||||
|
*/
|
||||||
|
FileStructW* _ILGetFileStructW(LPCITEMIDLIST pidl) {
|
||||||
|
FileStructW *pFileStructW;
|
||||||
|
WORD cbOffset;
|
||||||
|
|
||||||
|
if (!(_ILIsValue(pidl) || _ILIsFolder(pidl)))
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
cbOffset = *(WORD*)((LPBYTE)pidl + pidl->mkid.cb - sizeof(WORD));
|
||||||
|
pFileStructW = (FileStructW*)((LPBYTE)pidl + cbOffset);
|
||||||
|
|
||||||
|
/* Currently I don't see a fool prove way to figure out if a pidl is for sure of WinXP
|
||||||
|
* style with a FileStructW member. If we switch all our shellfolder-implementations to
|
||||||
|
* the new format, this won't be a problem. For now, we do as many sanity checks as possible. */
|
||||||
|
if (cbOffset & 0x1 || /* FileStructW member is word aligned in the pidl */
|
||||||
|
/* FileStructW is positioned after FileStruct */
|
||||||
|
cbOffset < sizeof(pidl->mkid.cb) + sizeof(PIDLTYPE) + sizeof(FileStruct) ||
|
||||||
|
/* There has to be enough space at cbOffset in the pidl to hold FileStructW and cbOffset */
|
||||||
|
cbOffset > pidl->mkid.cb - sizeof(cbOffset) - sizeof(FileStructW) ||
|
||||||
|
pidl->mkid.cb != cbOffset + pFileStructW->cbLen)
|
||||||
|
{
|
||||||
|
WARN("Invalid pidl format (cbOffset = %d)!\n", cbOffset);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return pFileStructW;
|
||||||
|
}
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
* _ILGetFileDateTime
|
* _ILGetFileDateTime
|
||||||
*
|
*
|
||||||
|
|
|
@ -143,6 +143,20 @@ typedef struct tagFileStruct
|
||||||
The second the dos name when needed or just 0x00 */
|
The second the dos name when needed or just 0x00 */
|
||||||
} FileStruct;
|
} FileStruct;
|
||||||
|
|
||||||
|
/* At least on WinXP, this struct is appended with 2-byte-alignment to FileStruct. There follows
|
||||||
|
* a WORD member after the wszName string, which gives the offset from the beginning of the PIDL
|
||||||
|
* to the FileStructW member. */
|
||||||
|
typedef struct tagFileStructW {
|
||||||
|
WORD cbLen;
|
||||||
|
BYTE dummy1[6];
|
||||||
|
WORD uCreationDate;
|
||||||
|
WORD uCreationTime;
|
||||||
|
WORD uLastAccessDate;
|
||||||
|
WORD uLastAccessTime;
|
||||||
|
BYTE dummy2[4];
|
||||||
|
WCHAR wszName[1];
|
||||||
|
} FileStructW;
|
||||||
|
|
||||||
typedef struct tagValueW
|
typedef struct tagValueW
|
||||||
{
|
{
|
||||||
WCHAR name[1];
|
WCHAR name[1];
|
||||||
|
@ -240,6 +254,7 @@ LPPIDLDATA _ILGetDataPointer (LPCITEMIDLIST);
|
||||||
LPSTR _ILGetTextPointer (LPCITEMIDLIST);
|
LPSTR _ILGetTextPointer (LPCITEMIDLIST);
|
||||||
LPSTR _ILGetSTextPointer (LPCITEMIDLIST);
|
LPSTR _ILGetSTextPointer (LPCITEMIDLIST);
|
||||||
IID *_ILGetGUIDPointer (LPCITEMIDLIST pidl);
|
IID *_ILGetGUIDPointer (LPCITEMIDLIST pidl);
|
||||||
|
FileStructW *_ILGetFileStructW (LPCITEMIDLIST pidl);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* debug helper
|
* debug helper
|
||||||
|
|
Loading…
Reference in New Issue