声明此为网上的一个例子(不知作者),移植到WINCE下的。此实例实现:应用程序(TestDll) 定义一个回调函数OnReceiveData()把该函数指针赋给dll(DllAutoSend),然后调用Dll,让Dll发送一个信息,Dll发送完成后,回调OnReceiveData(),把信息用消息框弹出来。
一、新建 dll 工程: DllAutoSend
1. 新建 DllAutoSend.h 头文件
2. /***DllAutoSend.h*****/
// 下列ifdef 块是创建使从DLL 导出更简单的
// 宏的标准方法。此DLL 中的所有文件都是用命令行上定义的DLLAUTOSEND_EXPORTS
// 符号编译的。在使用此DLL 的
// 任何其他项目上不应定义此符号。这样,源文件中包含此文件的任何其他项目都会将
// DLLAUTOSEND_API 函数视为是从DLL 导入的,而此DLL 则将用此宏定义的
// 符号视为是被导出的。
#ifdef DLLAUTOSEND_EXPORTS
#define DLLAUTOSEND_API __declspec(dllexport)
#else
#define DLLAUTOSEND_API __declspec(dllimport)
#endif
typedef BOOL (WINAPI *EXECUTECALLBACK)(char *pcBuf); //回调函数声明
// 此类是从DllAutoSend.dll 导出的
class DLLAUTOSEND_API CDllAutoSend {
public:
CDllAutoSend(void);
// TODO: 在此添加您的方法。
public:
void SetCallBack(EXECUTECALLBACK cmd); //设置回调函数指针
void SendDLLMessage(void); //发送一个信息,Dll要做的事情
static EXECUTECALLBACK AutoSendMessage; //定义一个回调函数指针
};
extern DLLAUTOSEND_API int nDllAutoSend;
DLLAUTOSEND_API int fnDllAutoSend(void);
3. /****DllAutoSend.cpp*****/的实现
// DllAutoSend.cpp : 定义DLL 应用程序的入口点。
3.1 //包含头文件
#include "DllAutoSend.h"
3.2 //把定义的回调函数指针初始为null
EXECUTECALLBACK CDllAutoSend::AutoSendMessage = NULL;
3.3 //实现头文件中声明的函数
CDllAutoSend::CDllAutoSend()
{
return;
}
void CDllAutoSend::SetCallBack(EXECUTECALLBACK cmd) //设置回调函数
{
CDllAutoSend::AutoSendMessage =cmd; //把回调函数的指针保存
}
void CDllAutoSend::SendDLLMessage(void)
{
if(AutoSendMessage) //如果设置了回调函数
AutoSendMessage("DLL Auto Send Message OK"); //则调用回调函数
}
二、新建应用程序TestDll
1. 把刚才Dll工程编译生成的lib加入工程中;
2. 在// TestDllDlg.h : 头文件
包含Dll的头文件 #include "DllAutoSend.h"
3. 声明一个dll实例
public:
CDllAutoSend m_DLL;
4. 在// TestDllDlg.cpp : 实现文件
中实现回调函数
BOOL WINAPI OnReceiveData(char *pcRecv) //回调函数的实现
{
CString strMsg =CString(pcRecv,50);
AfxMessageBox(strMsg);
return TRUE;
}
5. 添加两个按钮消息,实现如下:
void CTestDllDlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
m_DLL.SetCallBack(OnReceiveData); //设置回调函数
}
void CTestDllDlg::OnBnClickedButton2()
{
// TODO: 在此添加控件通知处理程序代码
m_DLL.SendDLLMessage(); //调用Dll的函数(Dll发送一个信息)
}