VC编程DLL通知应用程序exe通信(使用自定义消息实现)

源文件下载: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



已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页