Подтвердить что ты не робот

Программный выбор файла в проводнике

В моем приложении я могу программно открыть проводник и выбрать файл, используя следующий код:

void BrowseToFile(LPCTSTR filename)
{
    CString strArgs; 
    strArgs = _T("/select,\"");
    strArgs += filename; 
    strArgs += _T("\"");

    ShellExecute(0, _T("open"), _T("explorer.exe"), strArgs, 0, SW_NORMAL);
}

Моя проблема заключается в том, что если я вызову эту функцию во второй раз с другим файлом, но в той же папке, выбор в проводнике не изменится на новый файл, но останется в предыдущем файле.

Например, если я вызываю свою функцию с помощью C:\path\to\file1.txt, откроется новое окно проводника и будет выбран file1.txt. Если я снова вызову свою функцию с помощью C:\path\to\file2.txt, будет активировано существующее окно проводника, но выбор будет по-прежнему находиться на file1.txt.

Есть ли способ заставить исследователя обновить выбор или лучший способ выполнить это?

EDIT:

Поведение, упомянутое выше, было в Windows XP. Кажется, что поведение на Vista/Win7 отличается. Каждый вызов откроет новый экземпляр проводника и выберет файл.

Моя основная цель - реплицировать параметр Visual Studio на Открыть содержащую папку документа. Эта функция в Visual Studio ведет себя одинаково на XP, Vista и Win7. Он не будет создавать новый экземпляр, если другой экземпляр с той же папкой уже открыт, но он обновит выбор до нового файла.

Если кто-нибудь знает, как Visual Studio справится с этим, мне бы хотелось узнать об этом.

4b9b3361

Ответ 1

Нашел ответ на мой вопрос. Мне нужно использовать функцию оболочки SHOpenFolderAndSelectItems. Вот код функции, если кто-нибудь заинтересован:

void BrowseToFile(LPCTSTR filename)
{
    ITEMIDLIST *pidl = ILCreateFromPath(filename);
    if(pidl) {
        SHOpenFolderAndSelectItems(pidl,0,0,0);
        ILFree(pidl);
    }
}

Ответ 2

Попробуйте параметр "/n". Это, однако, откроет новую папку - возможно, уже открытую. Но, по крайней мере, выбранный вами файл выбран.

/n,/select,<path_and_filename>

SHOpenFolderAndSelectItems всегда терпит неудачу в моем случае, и я не могу понять, почему. Btw, вы должны вызвать CoInitialize/CoInitializeEx, прежде чем называть это.

Ответ 3

В случае, если вы указали, появится окно файла, которое выбирает файл только при инициализации, а не при активации.

Хотя это похоже на kludge, вы можете обнаружить XP, и только для этой ОС закройте диалог, используя его дескриптор, и откройте новый, чтобы настроить таргетинг на другой файл.