2013-03-08 2 views
11

у меня есть процедура, чтобы открыть папку в проводнике Windows, которая будет послана путь к каталогу:каталог Откройте Windows Explorer, выберите определенный файл (в Delphi)

procedure TfrmAbout.ShowFolder(strFolder: string); 
begin 
    ShellExecute(Application.Handle,PChar('explore'),PChar(strFolder),nil,nil,SW_SHOWNORMAL); 
end; 

Есть ли способ также передать это имя файла (полный путь к имени файла или только имя + расширение) и открыть папку в проводнике Windows, а также выделить/выбрать? В местоположении, которое я собираюсь, есть много файлов, и мне нужно затем манипулировать этим файлом в Windows.

+0

Используя метод, как ответил by Andreas Rejbrand ниже, я нахожусь в тупике со странной деятельностью, я на Win7 Pro 32bit, а иногда при ее использовании он либо открывает каталог, но не выделяет файл, либо открывает некоторые из обычного каталога и подчеркивает что-то полное не имеет значения. Например, только сейчас я использовал его для выбора файла, но он открыл мою личную папку пользователя и выделил папку «Мои документы», когда файл, на который я направлял его, не был даже на том же жестком диске. –

+0

Я только что заметил тенденцию с этой проблемой, это происходит, когда в имени файла есть определенные символы, например запятая, которая отбрасывает команду –

+0

ПРИМЕЧАНИЕ. Моя вышеупомянутая проблема была решена с помощью обновления Андреасом, в том числе другого более конкретного и надежного решение. –

ответ

33

Да, вы можете использовать /select flag при вызове explorer.exe:

ShellExecute(0, nil, 'explorer.exe', '/select,C:\WINDOWS\explorer.exe', nil, 
    SW_SHOWNORMAL) 

Несколько более фантазии (а также, возможно, более надежный) подход (uses ShellAPI, ShlObj):

const 
    OFASI_EDIT = $0001; 
    OFASI_OPENDESKTOP = $0002; 

{$IFDEF UNICODE} 
function ILCreateFromPath(pszPath: PChar): PItemIDList stdcall; external shell32 
    name 'ILCreateFromPathW'; 
{$ELSE} 
function ILCreateFromPath(pszPath: PChar): PItemIDList stdcall; external shell32 
    name 'ILCreateFromPathA'; 
{$ENDIF} 
procedure ILFree(pidl: PItemIDList) stdcall; external shell32; 
function SHOpenFolderAndSelectItems(pidlFolder: PItemIDList; cidl: Cardinal; 
    apidl: pointer; dwFlags: DWORD): HRESULT; stdcall; external shell32; 

function OpenFolderAndSelectFile(const FileName: string): boolean; 
var 
    IIDL: PItemIDList; 
begin 
    result := false; 
    IIDL := ILCreateFromPath(PChar(FileName)); 
    if IIDL <> nil then 
    try 
     result := SHOpenFolderAndSelectItems(IIDL, 0, nil, 0) = S_OK; 
    finally 
     ILFree(IIDL); 
    end; 
end; 
+0

Строка, переданная параметру, должна быть завершена нулем, не так ли? – Raul

+0

Да, компилятор гарантирует наличие нулевых терминаторов. –

+1

Обратите внимание: http://stackoverflow.com/questions/4291793/selecting-file-in-windows-explorers-does-not-always-work?rq=1 Это не всегда работает, и я на самом деле просто засвидетельствовал он не работает сам. –

Смежные вопросы