📄 shellord.c
字号:
old_lnk_name);
}
}
else {
ERR("Delete for %s failed, attr=%08lx\n",
old_lnk_name, attr);
}
}
else {
TRACE("deleted old .lnk file %s\n", old_lnk_name);
}
}
}
}
/* Create usable .lnk file name for the "Recent" directory
*/
wsprintfA(new_lnk_name, "%s.lnk", doc_name);
lstrcpyA(new_lnk_filepath, link_dir);
PathAppendA(new_lnk_filepath, new_lnk_name);
i = 1;
olderrormode = SetErrorMode(SEM_FAILCRITICALERRORS);
while (GetFileAttributesA(new_lnk_filepath) != INVALID_FILE_ATTRIBUTES) {
i++;
wsprintfA(new_lnk_name, "%s (%u).lnk", doc_name, i);
lstrcpyA(new_lnk_filepath, link_dir);
PathAppendA(new_lnk_filepath, new_lnk_name);
}
SetErrorMode(olderrormode);
TRACE("new shortcut will be %s\n", new_lnk_filepath);
/* Now add the new MRU entry and data
*/
pos = SHADD_create_add_mru_data(mruhandle, doc_name, new_lnk_name,
buffer, &len);
FreeMRUList(mruhandle);
TRACE("Updated MRU list, new doc is position %d\n", pos);
}
/* *** JOB 2: Create shortcut in user's "Recent" directory *** */
{ /* on input needs:
* doc_name - pure file-spec, no path
* new_lnk_filepath
* - path and file name of new .lnk file
* uFlags[in] - flags on call to SHAddToRecentDocs
* pv[in] - document path/pidl on call to SHAddToRecentDocs
*/
IShellLinkA *psl = NULL;
IPersistFile *pPf = NULL;
HRESULT hres;
CHAR desc[MAX_PATH];
WCHAR widelink[MAX_PATH];
CoInitialize(0);
hres = CoCreateInstance( &CLSID_ShellLink,
NULL,
CLSCTX_INPROC_SERVER,
&IID_IShellLinkA,
(LPVOID )&psl);
if(SUCCEEDED(hres)) {
hres = IShellLinkA_QueryInterface(psl, &IID_IPersistFile,
(LPVOID *)&pPf);
if(FAILED(hres)) {
/* bombed */
ERR("failed QueryInterface for IPersistFile %08lx\n", hres);
goto fail;
}
/* Set the document path or pidl */
if (uFlags == SHARD_PIDL) {
hres = IShellLinkA_SetIDList(psl, (LPCITEMIDLIST) pv);
} else {
hres = IShellLinkA_SetPath(psl, (LPCSTR) pv);
}
if(FAILED(hres)) {
/* bombed */
ERR("failed Set{IDList|Path} %08lx\n", hres);
goto fail;
}
lstrcpyA(desc, "Shortcut to ");
lstrcatA(desc, doc_name);
hres = IShellLinkA_SetDescription(psl, desc);
if(FAILED(hres)) {
/* bombed */
ERR("failed SetDescription %08lx\n", hres);
goto fail;
}
MultiByteToWideChar(CP_ACP, 0, new_lnk_filepath, -1,
widelink, MAX_PATH);
/* create the short cut */
hres = IPersistFile_Save(pPf, widelink, TRUE);
if(FAILED(hres)) {
/* bombed */
ERR("failed IPersistFile::Save %08lx\n", hres);
IPersistFile_Release(pPf);
IShellLinkA_Release(psl);
goto fail;
}
hres = IPersistFile_SaveCompleted(pPf, widelink);
IPersistFile_Release(pPf);
IShellLinkA_Release(psl);
TRACE("shortcut %s has been created, result=%08lx\n",
new_lnk_filepath, hres);
}
else {
ERR("CoCreateInstance failed, hres=%08lx\n", hres);
}
}
fail:
CoUninitialize();
/* all done */
RegCloseKey(HCUbasekey);
return;
}
/*************************************************************************
* SHCreateShellFolderViewEx [SHELL32.174]
*
* Create a new instance of the default Shell folder view object.
*
* RETURNS
* Success: S_OK
* Failure: error value
*
* NOTES
* see IShellFolder::CreateViewObject
*/
HRESULT WINAPI SHCreateShellFolderViewEx(
LPCSFV psvcbi, /* [in] shelltemplate struct */
IShellView **ppv) /* [out] IShellView pointer */
{
IShellView * psf;
HRESULT hRes;
TRACE("sf=%p cb=%p mode=0x%08x parm=%p\n",
psvcbi->pshf, psvcbi->pfnCallback,
psvcbi->fvm, psvcbi->psvOuter);
psf = IShellView_Constructor(psvcbi->pshf);
if (!psf)
return E_OUTOFMEMORY;
IShellView_AddRef(psf);
hRes = IShellView_QueryInterface(psf, &IID_IShellView, (LPVOID *)ppv);
IShellView_Release(psf);
return hRes;
}
/*************************************************************************
* SHWinHelp [SHELL32.127]
*
*/
HRESULT WINAPI SHWinHelp (DWORD v, DWORD w, DWORD x, DWORD z)
{ FIXME("0x%08lx 0x%08lx 0x%08lx 0x%08lx stub\n",v,w,x,z);
return 0;
}
/*************************************************************************
* SHRunControlPanel [SHELL32.161]
*
*/
HRESULT WINAPI SHRunControlPanel (DWORD x, DWORD z)
{ FIXME("0x%08lx 0x%08lx stub\n",x,z);
return 0;
}
static LPUNKNOWN SHELL32_IExplorerInterface=0;
/*************************************************************************
* SHSetInstanceExplorer [SHELL32.176]
*
* NOTES
* Sets the interface
*/
VOID WINAPI SHSetInstanceExplorer (LPUNKNOWN lpUnknown)
{ TRACE("%p\n", lpUnknown);
SHELL32_IExplorerInterface = lpUnknown;
}
/*************************************************************************
* SHGetInstanceExplorer [SHELL32.@]
*
* NOTES
* gets the interface pointer of the explorer and a reference
*/
HRESULT WINAPI SHGetInstanceExplorer (LPUNKNOWN * lpUnknown)
{ TRACE("%p\n", lpUnknown);
*lpUnknown = SHELL32_IExplorerInterface;
if (!SHELL32_IExplorerInterface)
return E_FAIL;
IUnknown_AddRef(SHELL32_IExplorerInterface);
return NOERROR;
}
/*************************************************************************
* SHFreeUnusedLibraries [SHELL32.123]
*
* NOTES
* exported by name
*/
void WINAPI SHFreeUnusedLibraries (void)
{
FIXME("stub\n");
}
/*************************************************************************
* DAD_AutoScroll [SHELL32.129]
*
*/
BOOL WINAPI DAD_AutoScroll(HWND hwnd, AUTO_SCROLL_DATA *samples, LPPOINT pt)
{
FIXME("hwnd = %p %p %p\n",hwnd,samples,pt);
return 0;
}
/*************************************************************************
* DAD_DragEnter [SHELL32.130]
*
*/
BOOL WINAPI DAD_DragEnter(HWND hwnd)
{
FIXME("hwnd = %p\n",hwnd);
return FALSE;
}
/*************************************************************************
* DAD_DragEnterEx [SHELL32.131]
*
*/
BOOL WINAPI DAD_DragEnterEx(HWND hwnd, POINT p)
{
FIXME("hwnd = %p (%ld,%ld)\n",hwnd,p.x,p.y);
return FALSE;
}
/*************************************************************************
* DAD_DragMove [SHELL32.134]
*
*/
BOOL WINAPI DAD_DragMove(POINT p)
{
FIXME("(%ld,%ld)\n",p.x,p.y);
return FALSE;
}
/*************************************************************************
* DAD_DragLeave [SHELL32.132]
*
*/
BOOL WINAPI DAD_DragLeave(VOID)
{
FIXME("\n");
return FALSE;
}
/*************************************************************************
* DAD_SetDragImage [SHELL32.136]
*
* NOTES
* exported by name
*/
BOOL WINAPI DAD_SetDragImage(
HIMAGELIST himlTrack,
LPPOINT lppt)
{
FIXME("%p %p stub\n",himlTrack, lppt);
return 0;
}
/*************************************************************************
* DAD_ShowDragImage [SHELL32.137]
*
* NOTES
* exported by name
*/
BOOL WINAPI DAD_ShowDragImage(BOOL bShow)
{
FIXME("0x%08x stub\n",bShow);
return 0;
}
static const WCHAR szwCabLocation[] = {
'S','o','f','t','w','a','r','e','\\',
'M','i','c','r','o','s','o','f','t','\\',
'W','i','n','d','o','w','s','\\',
'C','u','r','r','e','n','t','V','e','r','s','i','o','n','\\',
'E','x','p','l','o','r','e','r','\\',
'C','a','b','i','n','e','t','S','t','a','t','e',0
};
static const WCHAR szwSettings[] = { 'S','e','t','t','i','n','g','s',0 };
/*************************************************************************
* ReadCabinetState [SHELL32.651] NT 4.0
*
*/
BOOL WINAPI ReadCabinetState(CABINETSTATE *cs, int length)
{
HKEY hkey = 0;
DWORD type, r;
TRACE("%p %d\n", cs, length);
if( (cs == NULL) || (length < (int)sizeof(*cs)) )
return FALSE;
r = RegOpenKeyW( HKEY_CURRENT_USER, szwCabLocation, &hkey );
if( r == ERROR_SUCCESS )
{
type = REG_BINARY;
r = RegQueryValueExW( hkey, szwSettings,
NULL, &type, (LPBYTE)cs, (LPDWORD)&length );
RegCloseKey( hkey );
}
/* if we can't read from the registry, create default values */
if ( (r != ERROR_SUCCESS) || (cs->cLength < sizeof(*cs)) ||
(cs->cLength != length) )
{
ERR("Initializing shell cabinet settings\n");
memset(cs, 0, sizeof(*cs));
cs->cLength = sizeof(*cs);
cs->nVersion = 2;
cs->fFullPathTitle = FALSE;
cs->fSaveLocalView = TRUE;
cs->fNotShell = FALSE;
cs->fSimpleDefault = TRUE;
cs->fDontShowDescBar = FALSE;
cs->fNewWindowMode = FALSE;
cs->fShowCompColor = FALSE;
cs->fDontPrettyNames = FALSE;
cs->fAdminsCreateCommonGroups = TRUE;
cs->fMenuEnumFilter = 96;
}
return TRUE;
}
/*************************************************************************
* WriteCabinetState [SHELL32.652] NT 4.0
*
*/
BOOL WINAPI WriteCabinetState(CABINETSTATE *cs)
{
DWORD r;
HKEY hkey = 0;
TRACE("%p\n",cs);
if( cs == NULL )
return FALSE;
r = RegCreateKeyExW( HKEY_CURRENT_USER, szwCabLocation, 0,
NULL, 0, KEY_ALL_ACCESS, NULL, &hkey, NULL);
if( r == ERROR_SUCCESS )
{
r = RegSetValueExW( hkey, szwSettings, 0,
REG_BINARY, (LPBYTE) cs, cs->cLength);
RegCloseKey( hkey );
}
return (r==ERROR_SUCCESS);
}
/*************************************************************************
* FileIconInit [SHELL32.660]
*
*/
BOOL WINAPI FileIconInit(BOOL bFullInit)
{ FIXME("(%s)\n", bFullInit ? "true" : "false");
return 0;
}
/*************************************************************************
* IsUserAdmin [SHELL32.680] NT 4.0
*
*/
HRESULT WINAPI IsUserAdmin(void)
{ FIXME("stub\n");
return TRUE;
}
/*************************************************************************
* SHAllocShared [SHELL32.520]
*
* See shlwapi.SHAllocShared
*/
HANDLE WINAPI SHAllocShared(LPVOID lpvData, DWORD dwSize, DWORD dwProcId)
{
GET_FUNC(pSHAllocShared, shlwapi, (char*)7, NULL);
return pSHAllocShared(lpvData, dwSize, dwProcId);
}
/*************************************************************************
* SHLockShared [SHELL32.521]
*
* See shlwapi.SHLockShared
*/
LPVOID WINAPI SHLockShared(HANDLE hShared, DWORD dwProcId)
{
GET_FUNC(pSHLockShared, shlwapi, (char*)8, NULL);
return pSHLockShared(hShared, dwProcId);
}
/*************************************************************************
* SHUnlockShared [SHELL32.522]
*
* See shlwapi.SHUnlockShared
*/
BOOL WINAPI SHUnlockShared(LPVOID lpView)
{
GET_FUNC(pSHUnlockShared, shlwapi, (char*)9, FALSE);
return pSHUnlockShared(lpView);
}
/*************************************************************************
* SHFreeShared [SHELL32.523]
*
* See shlwapi.SHFreeShared
*/
BOOL WINAPI SHFreeShared(HANDLE hShared, DWORD dwProcId)
{
GET_FUNC(pSHFreeShared, shlwapi, (char*)10, FALSE);
return pSHFreeShared(hShared, dwProcId);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -