如果你的 MFC 程序调用 dll ,并且遇到与 handle 相关的错误,多数可以通过这两个宏来解决。简单的讲,每个模块,exe 或者 dll, 都模块内维护了一些状态,例如:句柄map,当使用句柄时,必须切换至正确的模块状态。一个常见的问题是,你的 exe 调用 dll 中一个 function,function 创建一个对话框,可是这个对话框怎么也创建不出来。这是因为,定义对话框的资源ID都定义在 dll 中,当前的模块状态却是 exe 状态,只需在 function 的入口处加入上面所列的第一宏,通常就可以解决这个问题。参加:MSDN
AFX_MANAGE_STATE(AfxGetStaticModuleState()); // dll
AFX_MANAGE_STATE(AfxGetAppModuleState()); // exe
取鼠标位置
LRESULT CMyWndClass::OnLButtonDown(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
CPoint point;
point.x = GET_X_LPARAM(lParam);
point.y = GET_Y_LPARAM(lParam);
...
bHandled = false;
return 0;
}
chain message map, ATL 工程
public class AFX_EXT_CLASS CMyWndClass :
public CWindowImpl<CMyWndClass>,
public CMyWndClassBase<CMyWndClass>,
{
public:
BEGIN_MSG_MAP(CCanvas)
MESSAGE_HANDLER(WM_CREATE, OnCreate)
MESSAGE_HANDLER(WM_PAINT, OnPaint)
MESSAGE_HANDLER(WM_SIZE, OnSize)
MESSAGE_HANDLER(WM_LBUTTONDOWN, OnLButtonDown)
CHAIN_MSG_MAP(CPlotter<CCanvas>)
END_MSG_MAP()
...
};
ATL 编写 COM 组件,实现 Singleton
DECLARE_CLASSFACTORY_SINGLETON(CMyClass)
-