TN003Mapování obslužných rutin Windows na objekty
Tato poznámka popisuje knihovny MFC rutin, které podporují mapování systému Windows objekt popisovače objektů jazyka C++.
Problém
Objekty Windows jsou obvykle reprezentovány různými zpracování objekty knihovny MFC třídy obtékání úchyty objektu systému Windows pomocí objektů jazyka C++.Popisovač přepisování funkcí třídy knihovny MFC umožňuje najít objekt jazyka C++, který obtéká objekt systému Windows, který má určitý popisovač.Nicméně někdy objekt neobsahuje objekt obálky C++ a v těchto časech systém vytvoří dočasný objekt jako obálka C++.
Objekty systému Windows, které používají mapování zpracování jsou následující:
HWND (CWnd a CWnd-odvozené třídy)
HDC (CSP a CDC-odvozené třídy)
HMENU (CMenu)
HPEN (CGdiObject)
HBRUSH (CGdiObject)
HFONT (CGdiObject)
HBITMAP (CGdiObject)
HPALETTE (CGdiObject)
HRGN (CGdiObject)
HIMAGELIST (CImageList)
SOKET (CSocket)
Popisovač věnovat některý z těchto objektů, lze najít objektu knihovny MFC, která obaluje popisovače voláním statické metody FromHandle.Například uděleno HWND nazývá hWnd, vrátí ukazatel na následující řádek CWnd , která obaluje hWnd:
CWnd::FromHandle(hWnd)
Pokud hWnd nemá objekt konkrétní obálky, dočasný CWnd je vytvořen zalomení hWnd.Díky tomu je možné získat od libovolného úchytu na platný objekt jazyka C++.
Jakmile máte objekt obálky, můžete načíst z veřejné členské proměnné třídy obálky její úchyt.U CWnd, m_hWnd obsahuje HWND pro daný objekt.
Připojení táhla k objektům knihovny MFC
Vzhledem k nově vytvořené táhlo obálky objektu a popisovač objektu systému Windows, můžete spojit dvě voláním Attach funkce jako v následujícím příkladu:
CWnd myWnd;
myWnd.Attach(hWnd);
To vytvoří položku v přidružení dočasné mapy myWnd a hWnd.Volání CWnd::FromHandle(hWnd) nyní vrátí ukazatel na myWnd.Při myWnd je odstraněn, je destruktor automaticky zničí hWnd voláním systému Windows DestroyWindow funkce.Pokud k tomu, hWnd musí být odpojena z myWnd před myWnd zničen (obvykle při opuštění rozsahu, ve kterém myWnd byla definována).Detach Metoda provádí.
myWnd.Detach();
Další informace o dočasných objektů
Dočasné objekty jsou vytvářeny vždy, když FromHandle je dán úchyt, který již nemá objekt obálky.Tyto dočasné objekty jsou odděleny od jejich zpracování a odstranil DeleteTempMap funkce.Ve výchozím nastavení CWinThread::OnIdle automaticky volá DeleteTempMap pro každou třídu, která podporuje dočasný popisovač mapování.To znamená, že nelze předpokládat, že ukazatel na dočasný objekt bude platit za bodem výstupu z funkce, kde byl získán ukazatel.
Objekty obalu a více vláken
Dočasné nebo trvalé objekty jsou udržovány na základě vlákna.Jednoho podprocesu nelze získat přístup jiným vláknem objektů C++ wrapper, bez ohledu na to, zda je dočasné nebo trvalé.
Předat tyto objekty z jednoho podprocesu do jiného, vždy je odeslat jako jejich nativní HANDLE typu.Předáním objektu C++ wrapper z jednoho podprocesu často způsobit neočekávané výsledky.