Changed pidl structure to match the pidl's used in lnk-files.
This commit is contained in:
parent
671c8846d1
commit
b791a5211d
|
@ -258,13 +258,12 @@ static BOOL32 WINAPI IEnumIDList_CreateEnumList(LPENUMIDLIST this, LPCSTR lpszPa
|
|||
if ( hFile != INVALID_HANDLE_VALUE32 )
|
||||
{ do
|
||||
{ if ( (stffile.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) && strcmp (stffile.cFileName, ".") && strcmp (stffile.cFileName, ".."))
|
||||
{ pidl = _ILCreateFolder( stffile.cFileName);
|
||||
{ pidl = _ILCreateFolder( stffile.cAlternateFileName, stffile.cFileName);
|
||||
if(pidl)
|
||||
{ pData = _ILGetDataPointer(pidl);
|
||||
FileTimeToDosDateTime(&stffile.ftLastWriteTime,&pData->u.folder.uFileDate,&pData->u.folder.uFileTime);
|
||||
pData->u.folder.dwFileSize = stffile.nFileSizeLow;
|
||||
pData->u.folder.uFileAttribs=stffile.dwFileAttributes;
|
||||
strncpy (pData->u.folder.szAlternateName, stffile.cAlternateFileName,14);
|
||||
if(!IEnumIDList_AddToEnumList(this, pidl))
|
||||
{ return FALSE;
|
||||
}
|
||||
|
@ -286,13 +285,12 @@ static BOOL32 WINAPI IEnumIDList_CreateEnumList(LPENUMIDLIST this, LPCSTR lpszPa
|
|||
if ( hFile != INVALID_HANDLE_VALUE32 )
|
||||
{ do
|
||||
{ if (! (stffile.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) )
|
||||
{ pidl = _ILCreateValue( stffile.cFileName);
|
||||
{ pidl = _ILCreateValue( stffile.cAlternateFileName, stffile.cFileName);
|
||||
if(pidl)
|
||||
{ pData = _ILGetDataPointer(pidl);
|
||||
FileTimeToDosDateTime(&stffile.ftLastWriteTime,&pData->u.file.uFileDate,&pData->u.file.uFileTime);
|
||||
pData->u.file.dwFileSize = stffile.nFileSizeLow;
|
||||
pData->u.file.uFileAttribs=stffile.dwFileAttributes;
|
||||
strncpy (pData->u.file.szAlternateName, stffile.cAlternateFileName,14);
|
||||
if(!IEnumIDList_AddToEnumList(this, pidl))
|
||||
{ return FALSE;
|
||||
}
|
||||
|
|
|
@ -28,6 +28,7 @@
|
|||
void pdump (LPCITEMIDLIST pidl)
|
||||
{ DWORD type;
|
||||
CHAR * szData;
|
||||
CHAR * szShortName;
|
||||
LPITEMIDLIST pidltemp = pidl;
|
||||
if (! pidltemp)
|
||||
{ TRACE(pidl,"-------- pidl = NULL (Root)\n");
|
||||
|
@ -38,8 +39,10 @@ void pdump (LPCITEMIDLIST pidl)
|
|||
{ do
|
||||
{ type = _ILGetDataPointer(pidltemp)->type;
|
||||
szData = _ILGetTextPointer(type, _ILGetDataPointer(pidltemp));
|
||||
szShortName = _ILGetSTextPointer(type, _ILGetDataPointer(pidltemp));
|
||||
|
||||
TRACE(pidl,"---- pidl=%p size=%u type=%lx %s\n",pidltemp, pidltemp->mkid.cb,type,debugstr_a(szData));
|
||||
TRACE(pidl,"---- pidl=%p size=%u type=%lx %s, (%s)\n",
|
||||
pidltemp, pidltemp->mkid.cb,type,debugstr_a(szData), debugstr_a(szShortName));
|
||||
|
||||
pidltemp = ILGetNext(pidltemp);
|
||||
} while (pidltemp->mkid.cb);
|
||||
|
@ -509,9 +512,9 @@ LPITEMIDLIST WINAPI SHSimpleIDListFromPath32AW (LPVOID lpszPath)
|
|||
|
||||
lpszElement = PathFindFilename32A(lpszTemp);
|
||||
if( GetFileAttributes32A(lpszTemp) & FILE_ATTRIBUTE_DIRECTORY )
|
||||
{ return _ILCreateFolder(lpszElement);
|
||||
{ return _ILCreateFolder(NULL, lpszElement); /*FIXME: fill shortname */
|
||||
}
|
||||
return _ILCreateValue(lpszElement);
|
||||
return _ILCreateValue(NULL, lpszElement); /*FIXME: fill shortname */
|
||||
}
|
||||
/*************************************************************************
|
||||
* SHGetDataFromIDListA [SHELL32.247]
|
||||
|
@ -565,13 +568,47 @@ LPITEMIDLIST WINAPI _ILCreateDrive( LPCSTR lpszNew)
|
|||
TRACE(pidl,"(%s)\n",sTemp);
|
||||
return _ILCreate(PT_DRIVE,(LPVOID)&sTemp[0],4);
|
||||
}
|
||||
LPITEMIDLIST WINAPI _ILCreateFolder( LPCSTR lpszNew)
|
||||
{ TRACE(pidl,"(%s)\n",lpszNew);
|
||||
return _ILCreate(PT_FOLDER, (LPVOID)lpszNew, strlen(lpszNew)+1);
|
||||
LPITEMIDLIST WINAPI _ILCreateFolder( LPCSTR lpszShortName, LPCSTR lpszName)
|
||||
{ char buff[MAX_PATH];
|
||||
char * pbuff = buff;
|
||||
ULONG len, len1;
|
||||
|
||||
TRACE(pidl,"(%s, %s)\n",lpszShortName, lpszName);
|
||||
|
||||
len = strlen (lpszName)+1;
|
||||
memcpy (pbuff, lpszName, len);
|
||||
pbuff += len;
|
||||
|
||||
if (lpszShortName)
|
||||
{ len1 = strlen (lpszShortName)+1;
|
||||
memcpy (pbuff, lpszShortName, len1);
|
||||
}
|
||||
else
|
||||
{ len1 = 1;
|
||||
*pbuff = 0x00;
|
||||
}
|
||||
return _ILCreate(PT_FOLDER, (LPVOID)buff, len + len1);
|
||||
}
|
||||
LPITEMIDLIST WINAPI _ILCreateValue(LPCSTR lpszNew)
|
||||
{ TRACE(pidl,"(%s)\n",lpszNew);
|
||||
return _ILCreate(PT_VALUE, (LPVOID)lpszNew, strlen(lpszNew)+1);
|
||||
LPITEMIDLIST WINAPI _ILCreateValue(LPCSTR lpszShortName, LPCSTR lpszName)
|
||||
{ char buff[MAX_PATH];
|
||||
char * pbuff = buff;
|
||||
ULONG len, len1;
|
||||
|
||||
TRACE(pidl,"(%s, %s)\n", lpszShortName, lpszName);
|
||||
|
||||
len = strlen (lpszName)+1;
|
||||
memcpy (pbuff, lpszName, len);
|
||||
pbuff += len;
|
||||
|
||||
if (lpszShortName)
|
||||
{ len1 = strlen (lpszShortName)+1;
|
||||
memcpy (pbuff, lpszShortName, len1);
|
||||
}
|
||||
else
|
||||
{ len1 = 1;
|
||||
*pbuff = 0x00;
|
||||
}
|
||||
return _ILCreate(PT_VALUE, (LPVOID)buff, len + len1);
|
||||
}
|
||||
|
||||
/**************************************************************************
|
||||
|
@ -926,7 +963,7 @@ LPPIDLDATA WINAPI _ILGetDataPointer(LPITEMIDLIST pidl)
|
|||
}
|
||||
/**************************************************************************
|
||||
* _ILGetTextPointer()
|
||||
* gets a pointer to the string stored in the pidl
|
||||
* gets a pointer to the long filename string stored in the pidl
|
||||
*/
|
||||
LPSTR WINAPI _ILGetTextPointer(PIDLTYPE type, LPPIDLDATA pidldata)
|
||||
{/* TRACE(pidl,"(type=%x data=%p)\n", type, pidldata);*/
|
||||
|
@ -940,7 +977,27 @@ LPSTR WINAPI _ILGetTextPointer(PIDLTYPE type, LPPIDLDATA pidldata)
|
|||
case PT_MYCOMP:
|
||||
case PT_FOLDER:
|
||||
case PT_VALUE:
|
||||
return (LPSTR)&(pidldata->u.file.szText);
|
||||
return (LPSTR)&(pidldata->u.file.szNames);
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
/**************************************************************************
|
||||
* _ILGetSTextPointer()
|
||||
* gets a pointer to the long filename string stored in the pidl
|
||||
*/
|
||||
LPSTR WINAPI _ILGetSTextPointer(PIDLTYPE type, LPPIDLDATA pidldata)
|
||||
{/* TRACE(pidl,"(type=%x data=%p)\n", type, pidldata);*/
|
||||
|
||||
if(!pidldata)
|
||||
{ return NULL;
|
||||
}
|
||||
switch (type)
|
||||
{ case PT_MYCOMP:
|
||||
case PT_DRIVE:
|
||||
return NULL;
|
||||
case PT_FOLDER:
|
||||
case PT_VALUE:
|
||||
return (LPSTR)(pidldata->u.file.szNames + strlen (pidldata->u.file.szNames) + 1);
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
|
|
@ -60,11 +60,9 @@ typedef struct tagPIDLDATA
|
|||
WORD uFileDate; /*06*/
|
||||
WORD uFileTime; /*08*/
|
||||
WORD uFileAttribs; /*10*/
|
||||
/* end of MS compatible. Here are comming just one or two
|
||||
strings. The first is the long name. The second the dos name
|
||||
when needed. */
|
||||
CHAR szAlternateName[14]; /* the 8.3 Name*/
|
||||
CHAR szText[1]; /* last entry, variable size */
|
||||
CHAR szNames[1]; /*12*/
|
||||
/* Here are comming two strings. The first is the long name.
|
||||
The second the dos name when needed or just 0x00 */
|
||||
} file, folder, generic;
|
||||
}u;
|
||||
} PIDLDATA, *LPPIDLDATA;
|
||||
|
@ -104,8 +102,8 @@ BOOL32 WINAPI _ILIsValue(LPCITEMIDLIST);
|
|||
LPITEMIDLIST WINAPI _ILCreateDesktop(void);
|
||||
LPITEMIDLIST WINAPI _ILCreateMyComputer(void);
|
||||
LPITEMIDLIST WINAPI _ILCreateDrive(LPCSTR);
|
||||
LPITEMIDLIST WINAPI _ILCreateFolder(LPCSTR);
|
||||
LPITEMIDLIST WINAPI _ILCreateValue(LPCSTR);
|
||||
LPITEMIDLIST WINAPI _ILCreateFolder(LPCSTR, LPCSTR);
|
||||
LPITEMIDLIST WINAPI _ILCreateValue(LPCSTR, LPCSTR);
|
||||
|
||||
/*
|
||||
* raw pidl handling (binary)
|
||||
|
@ -120,6 +118,7 @@ LPITEMIDLIST WINAPI _ILCreate(PIDLTYPE,LPVOID,UINT16);
|
|||
*/
|
||||
LPPIDLDATA WINAPI _ILGetDataPointer(LPCITEMIDLIST);
|
||||
LPSTR WINAPI _ILGetTextPointer(PIDLTYPE type, LPPIDLDATA pidldata);
|
||||
LPSTR WINAPI _ILGetSTextPointer(PIDLTYPE type, LPPIDLDATA pidldata);
|
||||
|
||||
void pdump (LPCITEMIDLIST pidl);
|
||||
#endif
|
||||
|
|
|
@ -424,10 +424,10 @@ static HRESULT WINAPI IShellFolder_ParseDisplayName(
|
|||
if(pidlFull)
|
||||
{ while((pszNext=GetNextElement(pszNext, szElement, MAX_PATH)))
|
||||
{ if(!*pszNext && bIsFile)
|
||||
{ pidlTemp = _ILCreateValue(szElement);
|
||||
{ pidlTemp = _ILCreateValue(NULL, szElement); /* FIXME: shortname */
|
||||
}
|
||||
else
|
||||
{ pidlTemp = _ILCreateFolder(szElement);
|
||||
{ pidlTemp = _ILCreateFolder(NULL, szElement); /* FIXME: shortname */
|
||||
}
|
||||
pidlOld = pidlFull;
|
||||
pidlFull = ILCombine(pidlFull,pidlTemp);
|
||||
|
|
117
include/shlobj.h
117
include/shlobj.h
|
@ -3,6 +3,7 @@
|
|||
|
||||
#include "wintypes.h"
|
||||
#include "wine/obj_base.h"
|
||||
#include "wine/obj_shelllink.h"
|
||||
#include "shell.h"
|
||||
#include "oleobj.h"
|
||||
#include "commctrl.h"
|
||||
|
@ -687,122 +688,6 @@ struct tagCOMMDLGBROWSER
|
|||
{ LPCOMMDLGBROWSER_VTABLE lpvtbl;
|
||||
DWORD ref;
|
||||
};
|
||||
#undef THIS
|
||||
/****************************************************************************
|
||||
* IShellLink interface
|
||||
*/
|
||||
|
||||
#define THIS LPSHELLLINK this
|
||||
/* IShellLink::Resolve fFlags */
|
||||
typedef enum {
|
||||
SLR_NO_UI = 0x0001,
|
||||
SLR_ANY_MATCH = 0x0002,
|
||||
SLR_UPDATE = 0x0004
|
||||
} SLR_FLAGS;
|
||||
|
||||
/* IShellLink::GetPath fFlags */
|
||||
typedef enum {
|
||||
SLGP_SHORTPATH = 0x0001,
|
||||
SLGP_UNCPRIORITY = 0x0002
|
||||
} SLGP_FLAGS;
|
||||
|
||||
|
||||
|
||||
typedef struct IShellLink IShellLink,*LPSHELLLINK;
|
||||
typedef struct IShellLink_VTable
|
||||
{
|
||||
/* *** IUnknown methods *** */
|
||||
STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID * ppvObj) PURE;
|
||||
STDMETHOD_(ULONG,AddRef) (THIS) PURE;
|
||||
STDMETHOD_(ULONG,Release) (THIS) PURE;
|
||||
|
||||
STDMETHOD(GetPath)(THIS_ LPSTR pszFile,INT32 cchMaxPath, WIN32_FIND_DATA32A *pfd, DWORD fFlags) PURE;
|
||||
|
||||
STDMETHOD(GetIDList)(THIS_ LPITEMIDLIST * ppidl) PURE;
|
||||
STDMETHOD(SetIDList)(THIS_ LPCITEMIDLIST pidl) PURE;
|
||||
|
||||
STDMETHOD(GetDescription)(THIS_ LPSTR pszName,INT32 cchMaxName) PURE;
|
||||
STDMETHOD(SetDescription)(THIS_ LPCSTR pszName) PURE;
|
||||
|
||||
STDMETHOD(GetWorkingDirectory)(THIS_ LPSTR pszDir,INT32 cchMaxPath) PURE;
|
||||
STDMETHOD(SetWorkingDirectory)(THIS_ LPCSTR pszDir) PURE;
|
||||
|
||||
STDMETHOD(GetArguments)(THIS_ LPSTR pszArgs,INT32 cchMaxPath) PURE;
|
||||
STDMETHOD(SetArguments)(THIS_ LPCSTR pszArgs) PURE;
|
||||
|
||||
STDMETHOD(GetHotkey)(THIS_ WORD *pwHotkey) PURE;
|
||||
STDMETHOD(SetHotkey)(THIS_ WORD wHotkey) PURE;
|
||||
|
||||
STDMETHOD(GetShowCmd)(THIS_ INT32 *piShowCmd) PURE;
|
||||
STDMETHOD(SetShowCmd)(THIS_ INT32 iShowCmd) PURE;
|
||||
|
||||
STDMETHOD(GetIconLocation)(THIS_ LPSTR pszIconPath,INT32 cchIconPath,INT32 *piIcon) PURE;
|
||||
STDMETHOD(SetIconLocation)(THIS_ LPCSTR pszIconPath,INT32 iIcon) PURE;
|
||||
|
||||
STDMETHOD(SetRelativePath)(THIS_ LPCSTR pszPathRel, DWORD dwReserved) PURE;
|
||||
|
||||
STDMETHOD(Resolve)(THIS_ HWND32 hwnd, DWORD fFlags) PURE;
|
||||
|
||||
STDMETHOD(SetPath)(THIS_ LPCSTR pszFile) PURE;
|
||||
} IShellLink_VTable,*LPSHELLLINK_VTABLE;
|
||||
|
||||
struct IShellLink {
|
||||
LPSHELLLINK_VTABLE lpvtbl;
|
||||
DWORD ref;
|
||||
/* IPersistfile interface */
|
||||
LPPERSISTFILE lppf;
|
||||
};
|
||||
#define IShellLinkA IShellLink
|
||||
|
||||
#undef THIS
|
||||
|
||||
#define THIS LPSHELLLINKW this
|
||||
|
||||
typedef struct IShellLinkW IShellLinkW,*LPSHELLLINKW;
|
||||
typedef struct IShellLinkW_VTable
|
||||
{
|
||||
/* *** IUnknown methods *** */
|
||||
STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID * ppvObj) PURE;
|
||||
STDMETHOD_(ULONG,AddRef) (THIS) PURE;
|
||||
STDMETHOD_(ULONG,Release) (THIS) PURE;
|
||||
|
||||
STDMETHOD(GetPath)(THIS_ LPWSTR pszFile,INT32 cchMaxPath, WIN32_FIND_DATA32A *pfd, DWORD fFlags) PURE;
|
||||
|
||||
STDMETHOD(GetIDList)(THIS_ LPITEMIDLIST * ppidl) PURE;
|
||||
STDMETHOD(SetIDList)(THIS_ LPCITEMIDLIST pidl) PURE;
|
||||
|
||||
STDMETHOD(GetDescription)(THIS_ LPWSTR pszName,INT32 cchMaxName) PURE;
|
||||
STDMETHOD(SetDescription)(THIS_ LPCWSTR pszName) PURE;
|
||||
|
||||
STDMETHOD(GetWorkingDirectory)(THIS_ LPWSTR pszDir,INT32 cchMaxPath) PURE;
|
||||
STDMETHOD(SetWorkingDirectory)(THIS_ LPCWSTR pszDir) PURE;
|
||||
|
||||
STDMETHOD(GetArguments)(THIS_ LPWSTR pszArgs,INT32 cchMaxPath) PURE;
|
||||
STDMETHOD(SetArguments)(THIS_ LPCWSTR pszArgs) PURE;
|
||||
|
||||
STDMETHOD(GetHotkey)(THIS_ WORD *pwHotkey) PURE;
|
||||
STDMETHOD(SetHotkey)(THIS_ WORD wHotkey) PURE;
|
||||
|
||||
STDMETHOD(GetShowCmd)(THIS_ INT32 *piShowCmd) PURE;
|
||||
STDMETHOD(SetShowCmd)(THIS_ INT32 iShowCmd) PURE;
|
||||
|
||||
STDMETHOD(GetIconLocation)(THIS_ LPWSTR pszIconPath,INT32 cchIconPath,INT32 *piIcon) PURE;
|
||||
STDMETHOD(SetIconLocation)(THIS_ LPCWSTR pszIconPath,INT32 iIcon) PURE;
|
||||
|
||||
STDMETHOD(SetRelativePath)(THIS_ LPCWSTR pszPathRel, DWORD dwReserved) PURE;
|
||||
|
||||
STDMETHOD(Resolve)(THIS_ HWND32 hwnd, DWORD fFlags) PURE;
|
||||
|
||||
STDMETHOD(SetPath)(THIS_ LPCWSTR pszFile) PURE;
|
||||
} IShellLinkW_VTable,*LPSHELLLINKW_VTABLE;
|
||||
|
||||
struct IShellLinkW {
|
||||
LPSHELLLINKW_VTABLE lpvtbl;
|
||||
DWORD ref;
|
||||
/* IPersistfile interface */
|
||||
LPPERSISTFILE lppf;
|
||||
};
|
||||
|
||||
#undef THIS
|
||||
|
||||
/****************************************************************************
|
||||
|
|
Loading…
Reference in New Issue