源文件下载:http://download.csdn.net/detail/dijkstar/9142497
1. 用VC创建两个工程,一个工程是DLL的(基于使用MFC的动态链接库的),假设名字为MFC_DLL;另一个是EXE的(基于MFC的应用程序),设工程名为MFC_EXE;
2. MFC_DLL实现了两个导出函数:
//导出函数 WIN32DLL_API void Start(HWND hWnd); WIN32DLL_API void End();第一个导出函数Start的窗口类型的参数,就是EXE调用时,向里面传递的窗口指针。看看Start函数的内部实现:
//注册窗口 WIN32DLL_API void Start(HWND hWnd) { g_bExit = false; g_hWnd = hWnd; //DLL中自动做的工作 AfxBeginThread(MyControllingFunction, NULL); } UINT MyControllingFunction( LPVOID pParam ) { while (1) { Sleep(100); if (g_bExit) break; //做些操作 mt.x++; //通知应用程序执行 if(g_hWnd) { PostMessage(g_hWnd, MY_MSG1, NULL, (LPARAM)&mt); } } return 1L; }DLL每隔100ms,递增一个数值,然后通知应用程序执行。
还有定义一条自定义消息:MY_MSG1,使用PostMessage来投递。
3. 应用程序EXE:
需要自己处理自定义消息:
BEGIN_MESSAGE_MAP(CMFC_EXEDlg, CDialog) //{{AFX_MSG_MAP(CMFC_EXEDlg) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_MESSAGE(MY_MSG1, OnMyMsg) ON_BN_CLICKED(IDC_BUTTON1, OnButton1) //}}AFX_MSG_MAP END_MESSAGE_MAP()
LRESULT CMFC_EXEDlg::OnMyMsg(WPARAM wParam, LPARAM lParam) { MY_TYPE *p = (MY_TYPE *)lParam; CString str; str.Format("%d", p->x); SetWindowText(str); return 1L; }
① DLL每次编译时,调用了工程目录下的一个1.bat文件,里面的内容是:
copy .\Debug\MFCDLL.dll ..\MFC_EXE\debug\
将产生的dll文件实时拷贝到exe的执行目录下,调用这个1.bat的方式是【工程】-【设置】-【Post-Build步骤】:
② 在该工程中,还有一个文件CleanVs2008.bat,运行它能清除VC6、VC2008的垃圾工程文件(也可以按自己删除的文件扩展名自己添加即可):
echo off rem 递归删除当前文件夹(".\"或者"./")下指定扩展名的文件 rem 如果想要添加其他的扩展名文件,按下面del开头格式的行,继续添加对应的扩展名即可 rem 添加del扩展名需注意:如"*.res",会把"*.resx"的文件也删掉(c#中用到"*.resx"文件)!! rem 【rem】开头的内容为注释语句,不起作用 set /p VAR=是否删除指定的文件,请选择:[Y, N]? rem echo %VAR% if /i '%VAR%' == 'y' goto s1 if /i '%VAR%' == 'n' goto end :s1 for /d %%i in (.\) do (cd %%i del /s *.mdp del /s *.clw del /s *.cpl del /s *.awk del /s *.map del /s *.scc del /s *.tlb del /s *.ncb del /s *.opt del /s *.plg del /s *.aps rem del /s *.res del /s *.idb del /s *.pch del /s *.sbr del /s *.obj del /s *.ilk del /s *.bsc del /s *.fd del /s *.bak del /s *.tlh del /s *.tli del /s *.pdb del /s *.exp del /s *.positions rem 下面是准备删除【debug】和【release】文件夹的内容,但谨慎删除!! rem rd /s/q debug rem rd /s/q release cd ..) :end pause