我将回调函数传递给库。回调基本上是从dll接收更新并将其发送到GUI进行显示。问题是,由于回调是全局或静态函数,因此它不知道GUI以及传递给谁的对话框。我用来实现这一目标的方法是使用单例和代理(类似)。
class CDispatcher
{
public:
CDispatcher(void);
~CDispatcher(void);
protected:
static HWND m_hWnd;
public:
static void SetWindow( HWND hWnd );
static void Dispatch(int code, char * msg);
};
稍后在代码中
BOOL CTestDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
// I need to set this before I set callback
CDispatcher::SetWindow( m_hWnd );
//now I can set the callback
LibRegisterCallback( CDispatcher::Dispatch );
return TRUE; // return TRUE unless you set the focus to a control
}
虽然这有效,但首先我不知道我的CDispatcher类是不是好模块。它似乎不是一个好的单身人士,它看起来不是一个好的代理人。也许我可以在构造函数中传递窗口的句柄,这会使它变得更好,但如果我甚至不可能实例化单例,我就不会这样做。另一件事是我从来没有如何实例化CDispatcher,因为它只是一个全球所有成员。
这是一种可以更好地应用代理设计模式的情况(我猜想与单身人士一起)?也许另一种模式更优雅地解决了这个问题?或者我的实施是否正常?