Sdílet prostřednictvím


TN003Mapování obslužných rutin Windows na objekty

Tato poznámka popisuje rutiny MFC, které podporují mapování obslužných rutin objektů systému Windows na objekty jazyka C++.

Problém

Objekty Systému Windows jsou obvykle reprezentovány různými objekty HANDLE Třídy MFC zalamují popisovače objektů systému Windows s objekty jazyka C++. Funkce obtékání úchytů knihovny tříd MFC umožňují najít objekt C++, který zabalí objekt Systému Windows, který má konkrétní popisovač. Někdy však objekt nemá objekt obálky jazyka C++ a v těchto případech systém vytvoří dočasný objekt, který bude fungovat jako obálka jazyka C++.

Objekty Systému Windows, které používají mapy popisovačů, jsou následující:

  • HWND (CWnd a CWnd-odvozené třídy)

  • HDC (CDC a CDC-odvozené třídy)

  • HMENU (CMenu)

  • HPEN (CGdiObject)

  • HBRUSH (CGdiObject)

  • HFONT (CGdiObject)

  • HBITMAP (CGdiObject)

  • HPALETTE (CGdiObject)

  • HRGN (CGdiObject)

  • HIMAGELIST (CImageList)

  • SOCKET (CSocket)

Vzhledem k popisovači některého z těchto objektů můžete najít mfc objekt, který zabalí popisovač voláním statické metody FromHandle. Například vzhledem k tomu, že HWND s názvem hWnd, následující řádek vrátí ukazatel na CWnd zalamování hWnd:

CWnd::FromHandle(hWnd)

Pokud hWnd nemá konkrétní objekt obálky, vytvoří se dočasný CWnd objekt pro zabalení hWnd. To umožňuje získat platný objekt C++ z libovolného popisovače.

Jakmile máte objekt obálky, můžete jeho popisovač načíst z veřejné členské proměnné třídy obálky. V případě CWnd, m_hWnd obsahuje HWND pro tento objekt.

Připojení popisovačů k objektům MFC

Vzhledem k nově vytvořenému objektu handle-wrapper a úchytu k objektu Windows můžete tyto dva objekty přidružit voláním funkce jako v tomto příkladu Attach :

CWnd myWnd;
myWnd.Attach(hWnd);

Tím se vytvoří položka v trvalé mapě asociující myWnd a hWnd. Volání CWnd::FromHandle(hWnd) teď vrátí ukazatel na myWnd. Když myWnd je odstraněn, destruktor automaticky zničí hWnd voláním Windows DestroyWindow funkce. Pokud to není žádoucí, musí být hWnd odpojen od myWnd před zničením myWnd (obvykle při opuštění oboru, ve kterém byl definován myWnd). Metoda Detach to dělá.

myWnd.Detach();

Další informace o dočasných objektech

Dočasné objekty se vytvoří vždy, když FromHandle je udělen popisovač, který ještě nemá objekt obálky. Tyto dočasné objekty jsou odpojeny od jejich popisovače a odstraněny DeleteTempMap funkcemi. Ve výchozím nastavení CWinThread::OnIdle automaticky volá DeleteTempMap pro každou třídu, která podporuje dočasné popisovače mapy. To znamená, že nelze předpokládat, že ukazatel na dočasný objekt bude platný po bodu ukončení funkce, kde byl ukazatel získán.

Objekty obálky a více vláken

Dočasné i trvalé objekty se udržují na základě jednotlivých vláken. To znamená, že jedno vlákno nemůže přistupovat k objektům obálky C++ jiného vlákna bez ohledu na to, zda je dočasné nebo trvalé.

Pokud chcete tyto objekty předat z jednoho vlákna do druhého, vždy je odešlete jako jejich nativní HANDLE typ. Předání objektu obálky C++ z jednoho vlákna do jiného často způsobí neočekávané výsledky.

Viz také

Technické poznámky podle čísel
Technické poznámky podle kategorií