
A mellékelt példa kipróbálásával kapcsolatos információkat a cikk Kezdeti lépések című szakaszában kaphat.
Kezdeti lépések
Az új oszlop felvételének megvalósítására a Windows 2000-től kezdve van lehetőségünk, illetve minden olyan rendszeren, ahol az Internet Explorer 5-ös, vagy ennél magasabb verziója van telepítve. Ez utóbbi frissíti ugyanis a Shell32.dll-t a megfelelő verziószámúra, így az IColumnProvider interfész, melyre a megvalósításhoz szükségünk lesz, már rendelkezésre áll.
A mellékelt példa kipróbálásához az alábbi lépésekre van szükség:
- Be kell zárnunk az összes futó Windows Intéző példányt.
- Le kell fordítanunk a projektet, hogy a generált DLL COM komponensként regisztrálódjon.
- Indítsunk el egy új Intéző-példányt.
- Váltsunk egy tetszőleges mappa részletes nézetére.
- Kattintson az állományok listájának fejlécén jobb gombbal.
- A megjelenő menüből válassza az Egyéb menüpontot.
- A megjelenő ablakban jelölje be az „Szülőmappa neve” nevű oszlopot, majd zárja be az ablakot.
A művelet eredményeképpen megjelenik egy új oszlop az állományok adatait tartalmazó oszlopok sorában, mely – az egyszerűség kedvéért – a szülőmappák neveit tartalmazza.
A megvalósítás
Annak érdekében, hogy a Windows Intézőjében egy új oszlopot hozhassunk létre, egy saját COM komponenst kell készítenünk, mely implementálja az IColumnProvider interfész metódusait. Az interfész, a tulajdonságait implementáló osztály, valamint a megvalósításhoz szükséges menedzselt adattípusok deklarációi a MyLib.cs állományban találhatók.
Az IColumnProvider interfész három metódussal bír, melyeket az utód osztályban meg kell valósítanunk, ezek a következők:
- Initialize
- GetColumnInfo
- GetitemData
Az interfész deklarációja a következő:
[ComVisible(false), ComImport, Guid("E8025004-1C42-11d2-BE2C-00A0C9A83DA1"),
InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface IColumnProvider
{
[PreserveSig()]
int Initialize(LPCSHCOLUMNINIT psci);
[PreserveSig()]
int GetColumnInfo(int dwIndex, out SHCOLUMNINFO psci);
[PreserveSig()]
int GetItemData( LPCSHCOLUMNID pscid, LPCSHCOLUMNDATA pscd, out object pvarData);
}
Létrehoztunk egy absztrakt osztályt, melynek kódját kiegészítettük a két metódussal, a regisztráció érdekében. Ezek a Register és az UnRegister nevű metódusok.
A tényleges megvalósítást az absztrakt osztályból származó ColumnClass osztály végzi el. A GetColumnInfo metódusban adjuk meg, hogy milyen jellemzőkkel rendelkezzen a létrehozandó oszlop. Itt létrehozunk egy már deklarált típusú struktúrát, mely tartalmazz az adatokat. Ennek neve SHCOLUMNINFO.
Majd sorban megadjuk az oszlop adatait, elsőként a megjelenítendő információ típusát, mely most karakterlánc.
psci.csFlags=SHCOLSTATE.TYPE_STR;
Megadjuk az oszlop fejlécének nevét, valamint egy leírást.
psci.wszTitle = "Szülőmappa neve";
psci.wszDescription = "Az oszlop a szülőmappa nevét jeleníti meg";
A GetItemData metódusban határozhatjuk meg, hogy mi is kerüljön konkrétan egy-egy állomány mellé az Intéző adott nézetében, a deklarált oszlopban. A példában megadjuk, hogy oszlop esetén ne jelenjen meg semmi.
if (((FileAttributes)pscd.dwFileAttributes|FileAttributes.Directory) == FileAttributes.Directory)
{
return S_FALSE;
}
Állományok esetén viszont jelenjen meg a szülőmappa neve.
FileInfo fi = new FileInfo(pscd.wszFile);
pvarData = fi.Directory.Name;
A fordítás után tehát regisztrálódott a COM komponensünk. Amennyiben módosítottuk a DLL kódját, és újra szeretnénk fordítani a projektet, nem fog sikerülni. Szükség van arra, hogy újrafordítás előtt felszabadítsuk a DLL-t.
Ennek érdekében le kell állítanunk a futó EXPLORER.EXE nevű process-t, mely megakadályozza ezt. Ehhez indítsuk el a Task Manager alkalmazást (NT alapú rendszerekben CTRL+ALT+DEL kombináció), majd a process nevét kijelölve válasszuk a Folyamat leállítása lehetőséget. Ekkor a Tálca eltűnik, de a projekt újrafordítható. A művelet után indítsuk el újra a leállított folyamatot, aminek eredményeképpen a Tálca ismét megjelenik.