Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
Korábban láttuk, hogy egy objektum több felületet is képes implementálni. A Common Item Dialog objektum egy valós példa erre. A legjellemzőbb felhasználások támogatása érdekében az objektum implementálja az IFileOpenDialog felületet. Ez a felület alapvető módszereket határoz meg a párbeszédpanel megjelenítéséhez és a kijelölt fájl adatainak lekéréséhez. A fejlettebb használat érdekében azonban az objektum egy IFileDialogCustomizenevű felületet is implementál. A program ezt az felületet használhatja a párbeszédpanel megjelenésének és viselkedésének testreszabásához új felhasználói felületi vezérlők hozzáadásával.
Ne feledje, hogy minden COM-felületnek közvetlenül vagy közvetve kell örökölnie az IUnknown interfészt. Az alábbi ábra a Common Item Dialog objektum öröklését mutatja be.
Ahogy a diagramon látható, az IFileOpenDialog közvetlen őse az IFileDialog felület, amely viszont örökli IModalWindow. A IFileOpenDialog és IModalWindowközötti öröklési láncot felfelé haladva a felületek egyre általánosabb ablakfunkciókat határoznak meg. Végül az IModalWindow interfész örökli IUnknown. A Common Item Dialog objektum IFileDialogCustomizeis implementál, amely egy külön öröklési láncban létezik.
Tegyük fel, hogy van egy mutatója az IFileOpenDialog interfészre. Hogyan kapna mutatót az IFileDialogCustomize felülethez?
Az IFileOpenDialog mutatót egyszerűen IFileDialogCustomize mutatóvá alakítani nem fog működni. Az öröklési hierarchiákban nincs megbízható módszer a "keresztbe vetítésre" a futási idő típusú információk (RTTI) nélkül, amely egy erősen nyelvfüggő funkció.
A COM-módszer az, kérni az objektumot, hogy adjon egy IFileDialogCustomize mutatót, az első interfészt használva az objektumba. Ez úgy történik, hogy meghívja a IUnknown::QueryInterface metódust az első felületmutatóból. A QueryInterface a C++ dynamic_cast kulcsszó nyelvfüggetlen verziójaként is felfogható.
A QueryInterface metódus a következő aláírást tartalmazza:
HRESULT QueryInterface(REFIID riid, void **ppvObject);
A CoCreateInstanceismerete alapján kitalálhatja, hogyan működik QueryInterface.
- A riid paraméter az a GUID, amely azonosítja a kért felületet. Az adattípus REFIID egy typedef
const GUID&számára. Figyelje meg, hogy az osztályazonosító (CLSID) nem szükséges, mert az objektum már létrejött. Csak az interfészazonosító szükséges. - A ppvObject paraméter mutatót kap a felülethez. A paraméter adattípusa érvénytelen**, ugyanazért, amiért CoCreateInstance ezt az adattípust használja: QueryInterface bármely COM-felület lekérdezésére használható, így a paraméter nem írható be erősen.
Az alábbiak szerint hívhatja meg QueryInterface, hogy lekérjen egy IFileDialogCustomize mutatót:
hr = pFileOpen->QueryInterface(IID_IFileDialogCustomize,
reinterpret_cast<void**>(&pCustom));
if (SUCCEEDED(hr))
{
// Use the interface. (Not shown.)
// ...
pCustom->Release();
}
else
{
// Handle the error.
}
Mint mindig, ellenőrizze a HRESULT visszatérési értékét, ha a metódus sikertelen. Meg kell hívnia a Release-t, amikor végzett a mutató használatával, ahogyan azt az Objektum élettartamának kezeléseleírja.
Következő