源文件下载: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;
}
4. 其他
① 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