Interfața este reluată - capitolul 31

Această interfață corespunde cu dosarul - unul dintre elementele principale ale spațiului de nume Explorer. De ce a fost introdus termenul "dosar" când erau deja acceptate "catalog" și "director"? Spre deosebire de ultimele două, dosarul nu poate fi doar un obiect obișnuit al sistemului de fișiere. Poate fi virtual - cum ar fi dosarele Imprimante, Documente sau Panoul de control. Orice dosar poate conține o colecție de obiecte din spațiul de nume.







După ce ați primit un pointer la interfața ishellFoider, corespunzătoare dosarului, puteți lucra cu acesta, ca și în cazul obiectului COM. Dosarul "Top" (dosarul rădăcină) din spațiul de nume este dosarul Desktop. Puteți obține interfața isheiiFoider a acestui dosar prin apelarea funcției:

funcția SHGetDesktopFolder (var ppshf: IShellFolder): HResult;

Logica de a lucra cu interfața descrisă este aceasta: mai întâi trebuie să obțineți interfața dosarului dorit și apoi puteți merge să lucrați cu conținutul său. Conținutul este o listă și fiecare element al dosarului este reprezentat de structura pitemiDList. Această structură nu este tastată; singurul său câmp obligatoriu conține lungimea în octeți, știind care poate fi mutată la următorul element. Adică, lanțul obișnuit este obținut. Toate celelalte câmpuri sunt completate cu funcțiile și metodele corespunzătoare ale interfeței ishellFoider.

Luați în considerare funcțiile interfeței ishellFoider. Sub "dosarul curent" din Tabelul. 31.1 este dosarul care reprezintă în prezent interfața IShellFolder.

Tabelul 31.1. Funcțiile interfeței IShellFolder

A treia opțiune este de a obține pidi-ul dosarului dorit - interactiv, utilizând funcția Shell API.

funcția ShBrowseForFolder (var Ipbi: TBrowselnfo): PItemlDList;

Înainte de a o apela, trebuie să completați o structură de tipul TBrowselnfo, care conține, în special, pidi al elementului care va fi elementul rădăcină. După apelarea funcției, utilizatorul va vedea o casetă de dialog pentru selectarea dosarului înaintea lui (Figura 31.3).

Fig. 31.3. Caseta de dialog pentru selectarea unui dosar creat prin apelarea funcției ShBrowseForFolder

În acest exemplu, folderul virtual MyComputer servește ca director rădăcină. Utilizatorului i se oferă posibilitatea de a selecta unul dintre folderele sistemului de fișiere (pentru aceasta, pavilionul TBrowseinfo.uiFlags, egal

La ieșire, funcția returnează un dosar pidi, numele căruia este extras din ea apelând o altă funcție Shell - shGetPathFromList.







procedura TForml / ButtonlClick (expeditor: TObject);

StartPIDL, ResPIDL. PItemlDList;

S, Path. ArraytO..max_path-l] De WideChar;

01eCheck (SHGetSpecialFolderLocation (Mâner, CSIDL_DRIVES, StartPIDL));

IpszTitle = 'Selectați dosarul dorit';

dacă SHGETPathFromlDList (ResPIDL, @Path [0])

apoi Labe11.Caption: = StrPas (@Path [0]);

Numele primit este afișat aici utilizând componenta Label 1.

dacă nu Succes (DeskTop.ParseDisplayName

(Self.Handle, nil, StringToWideChar (Editl.Text, ws, MAX_PATH), n, pidi, attr))

apoi începe ShowMessage ("Numele necunoscut");

Exit; se încheie; OleCheck (DeskTop.BindToObject (pidl, nil, IID_IShellFolder, Pointer (NewShellFolder)>);

SHCONTF_FOLDERS sau SHCONTF_NONFOLDERS, Enumerator)); în timp ce Enumerator.Next (1, pidl, Numpidls) = S_OK

NewShellFolder.GetDisplayNameOf (PIDL, SHGDN_FORPARSING, StrRet); caz strRet.uType STRRET_CSTR:

s: = StrRet.cStr; STRRET_OFFSET:

P: = @ PIDL.mkid.abID [StrRet.uOffset - SizeOf (PIDL.mkid.cb)];

SetString (s, P, PIDL.mkid.cb - StrRet.uOffset);

pe ErEOleSysError do ShowMessage ('');

În acest exemplu, numele folderului dorit este extras din componenta Edit1. După ce a primit pointerul la interfața ishellFoider și apoi la interfața IEnumiDList, programul completează lista Memol.Lines cu numele de fișiere primite.

În plus față de numele celor mai multe obiecte din sistemul de fișiere, puteți "scoate" o mulțime de informații utile. Cel mai adesea adresați întrebarea: cum extrag pictograma corespunzătoare acestui fișier sau care este stocată în acesta?

Există mai multe modalități de a atinge acest obiectiv. Cel mai simplu este printr-un apel de funcții:

funcția SHGetFileInfo (pszPath: PAnsiChar; dwFileAttributes: DWORD;

var psfi: TSHFilelnfo; cbFileInfo, uFlags: UINT): DWORD;

Parametrul pszPath poate fi un pointer atât pentru un șir cu un nume de fișier, cât și pentru o structură pidl. Funcția umple structura psfi (tip TSHFilelnfo) cu lungimile cbFilelnfo de lungime. În funcție de semnificația steagurilor de cuvinte (parametru uFlags) la ieșirea poate fi informații variate. În special, în cazul în care valorile parametrilor sunt setate uFlags SHGFI_SYSICONINDEX și SHGFI_ICON, atunci structura se va înregistra numărul IFPS insigna fișierul în lista de imagine de sistem, iar rezultatul funcției se va ocupa de această listă. Puteți să o utilizați (de exemplu, pentru bara de instrumente) astfel:

procedura TForml.FormCreate (expeditor: TObject);

SHGFI_SYSICONINDEX sau SHGFI_ICON);

TrimitereMessage (ToolBarl.Handle, TB_SETIMAGELIST, 0, ImageListHandle);

În mod similar, puteți extrage pictograma corespunzătoare unui anumit fișier. Shell conține alte funcții create pentru extragerea icoanelor:

  • Funcția Extractlcon (hlnst: HINST; IpszExeFileName: PChar; nlconlndex: UINT): HICON;

Această funcție extrage o pictogramă din fișierul IpszExeFileName (trebuie să fie un fișier de tip EXE, DLL sau ICO) și returnează descriptorul. Dacă pictograma nu este găsită, valoarea returnată este 0.

  • Funcția ExtractAssociatedIcon (hInst: HINST; IpIconPath: PChar; var Ipilcon: Word): HICON;

Această funcție poate funcționa cu fișiere de diferite formate. În primul rând, acesta, ca cel precedent, caută pictograma din corpul fișierului. Dacă nu există, se face o încercare de a găsi pictograma în aplicația asociată cu acest tip de fișier. De exemplu, dintr-un fișier cu extensia doc, va fi extras unul dintre pictogramele Microsoft Word.








Trimiteți-le prietenilor: