Author: dquintana Date: Thu Jun 19 23:24:09 2014 New Revision: 63622
URL: http://svn.reactos.org/svn/reactos?rev=63622&view=rev Log: [FILEBROWSER] * Copy basic path parsing from explorer-new, so filebrowser.exe can load with a different folder active.
Modified: branches/shell-experiments/base/shell/filebrowser/filebrowser.c
Modified: branches/shell-experiments/base/shell/filebrowser/filebrowser.c URL: http://svn.reactos.org/svn/reactos/branches/shell-experiments/base/shell/fil... ============================================================================== --- branches/shell-experiments/base/shell/filebrowser/filebrowser.c [iso-8859-1] (original) +++ branches/shell-experiments/base/shell/filebrowser/filebrowser.c [iso-8859-1] Thu Jun 19 23:24:09 2014 @@ -28,18 +28,110 @@
int _tmain(int argc, _TCHAR* argv[]) { + WCHAR root[MAX_PATH]; + HRESULT hr; + LPSHELLFOLDER pDesktopFolder = NULL; + LPITEMIDLIST pidlRoot = NULL; + typedef HRESULT(WINAPI *SH_OPEN_NEW_FRAME)(LPITEMIDLIST pidl, IUnknown *paramC, long param10, long param14); + SH_OPEN_NEW_FRAME SHOpenNewFrame; + HMODULE hBrowseui = LoadLibraryW(L"browseui.dll"); - if (hBrowseui) + + if (!hBrowseui) + return 1; + + + if (argc < 2) { - SH_OPEN_NEW_FRAME SHOpenNewFrame = (SH_OPEN_NEW_FRAME)GetProcAddress(hBrowseui, (LPCSTR)103); + SH_OPEN_NEW_FRAME SHOpenNewFrame = (SH_OPEN_NEW_FRAME) GetProcAddress(hBrowseui, (LPCSTR) 103); LPITEMIDLIST pidlDrives; SHGetSpecialFolderLocation(NULL, CSIDL_DRIVES, &pidlDrives); - SHOpenNewFrame((LPITEMIDLIST)pidlDrives, NULL, 0, 0); + SHOpenNewFrame((LPITEMIDLIST) pidlDrives, NULL, 0, 0); + } + else + { + /* A shell is already loaded. Parse the command line arguments + and unless we need to do something specific simply display + the desktop in a separate explorer window */ + /* FIXME */ + + /* Commandline switches: + * + * /n Open a new window, even if an existing one still exists. + * /e Start with the explorer sidebar shown. + * /root,<object> Open a window for the given object path. + * /select,<object> Open a window with the given object selected. + */ + + /* FIXME: Do it right */ + WCHAR* tmp = wcsstr(argv[1], L"/root,"); + if (tmp) + { + WCHAR* tmp2; + + tmp += 6; // skip to beginning of path + tmp2 = wcschr(tmp, L','); + + if (tmp2) + { + wcsncpy(root, tmp, tmp2 - tmp); + } + else + { + wcscpy(root, tmp); + } + } + else + { + wcscpy(root, argv[1]); + } + + if (root[0] == L'"') + { + int len = wcslen(root) - 2; + wcsncpy(root, root + 1, len); + root[len] = 0; + } + + if (wcslen(root) > 0) + { + LPITEMIDLIST pidl; + ULONG chEaten; + ULONG dwAttributes; + + if (SUCCEEDED(SHGetDesktopFolder(&pDesktopFolder))) + { + hr = pDesktopFolder->lpVtbl->ParseDisplayName(pDesktopFolder, + NULL, + NULL, + root, + &chEaten, + &pidl, + &dwAttributes); + if (SUCCEEDED(hr)) + { + pidlRoot = pidl; + } + } + } + + if (!pidlRoot) + { + hr = SHGetSpecialFolderLocation(NULL, CSIDL_DRIVES, &pidlRoot); + if (FAILED(hr)) + return 0; + } + + SHOpenNewFrame = (SH_OPEN_NEW_FRAME) GetProcAddress(hBrowseui, (LPCSTR) 103); + + hr = SHOpenNewFrame(pidlRoot, (IUnknown*) pDesktopFolder, 0, 0); + if (FAILED(hr)) + return 0; }
- /* FIXME: we should wait a bit here and see if a window was created. If not we should exit this process */ + /* FIXME: we should wait a bit here and see if a window was created. If not we should exit this process. */ + Sleep(1000); + ExitThread(0); - - return 0; }