diff --git a/base/shell/filebrowser/filebrowser.c b/base/shell/filebrowser/filebrowser.c index 8bbfe47379d..d7e22d95bac 100644 --- a/base/shell/filebrowser/filebrowser.c +++ b/base/shell/filebrowser/filebrowser.c @@ -28,18 +28,110 @@ typedef HRESULT (WINAPI *SH_OPEN_NEW_FRAME)(LPITEMIDLIST pidl, IUnknown *paramC, 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, Open a window for the given object path. + * /select, 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 */ - ExitThread(0); + /* FIXME: we should wait a bit here and see if a window was created. If not we should exit this process. */ + Sleep(1000); - return 0; + ExitThread(0); }