如何在 DLL 中创建事件?
这个示例演示了如何在 DLL 文件中创建事件,以及随后如何从客户端程序调用此事件。
引言
这个示例演示了如何在 DLL 文件中创建事件,以及随后如何从客户端程序调用此事件。 希望它可以帮助您理解 VC++ 中的 DLL 事件机制和 CALLBACK 术语。
图表

使用代码
1. 打开 VC++,创建一个名为“DllEvent”的“Win32 动态链接库”项目。
2. 在“Win32 动态链接库 - 步骤 1/1”对话框中,选择“一个简单的 DLL 项目”。 然后,单击“完成”。
3. 将“DllEvent.h”添加到“头文件”,如下所示。
#ifdef DLLEVENT_EXPORTS #undef DLLEVENT_EXPORTS #define DLLEVENT_EXPORTS __declspec(dllexport) #else #define DLLEVENT_EXPORTS __declspec(dllimport) #endif typedef void (CALLBACK *EventCallback)(); DLLEVENT_EXPORTS void WINAPI SetEventCallback(EventCallback func); DLLEVENT_EXPORTS void WINAPI FireEvent();
注意:“DLLEVENT_EXPORTS”已在“项目”->“设置”->“C/C++”->“预处理器定义”中定义,否则在 DllEvent.h 中键入“#define DLLEVENT_EXPORTS”。
4. 将“DllEvent.def”添加到“头文件es”,如下所示。
LIBRARY "DllEvent" EXPORTS SetEventCallback @1 FireEvent @2注意:如果不定义此 def 文件,则输出函数将类似于“?FireEvent@@YGXXZ”和“?SetEventCallback@@YGXP6GXXZ@Z”。 添加此 def 并重新编译项目后,输出函数将为“SetEventCallback”和“FireEvent”。
5. 将以下 include 语句和函数内容添加到“DllEvent.cpp”。
#include "DllEvent.h" EventCallback OnEvent=NULL; DLLEVENT_EXPORTS void WINAPI SetEventCallback(EventCallback func) { OnEvent = func; } DLLEVENT_EXPORTS void WINAPI FireEvent() { if (OnEvent) OnEvent(); }
6. 编译此项目,您应该在 Debug 文件夹下看到生成的“DllEvent.dll”和“DllEvent.lib”。
7. 创建一个新的“MFC AppWizard(exe)”项目,输入“CallDllEvent”作为项目名称,然后选中“添加到当前工作区”。 在下一步中,选择“基于对话框”作为其类型。
8. 打开菜单“项目”->“依赖项”。 然后,选择“CallDllEvent”并选中“DllEvent”作为其依赖项。 这样,您可以在工作区中调试“DllEvent”和“CallDllEvent”,并且还可以确保编译顺序(首先编译 DllEvent,然后编译“CallDllEvent”)。
9. 删除默认的 2 个按钮(“确定”、“取消”)和“Todo....”静态文本。 然后,添加一个按钮(ID:“IDC_CallDll”,标题:“Call Dll”)。
10. 双击 IDC_CallDll 按钮并添加以下内容。
void CCallDllEventDlg::OnCalldll() { // TODO: Add your control notification handler code here SetEventCallback( HandleEvent ); FireEvent(); }
11. 打开“CallDllEventDlg.cpp”,在“void CCallDllEventDlg::OnCalldll()”之前输入以下事件处理程序。
void CALLBACK HandleEvent() { AfxMessageBox("Get event from Dll!"); }
12. 打开菜单“工具”->“选项”->“目录”。 在该选项卡中,选择“包含文件”并添加“DllEvent.h”所在的目录。 此外,选择“库文件”并添加“DllEvent.lib”所在的目录。 这样,您就不必将“DllEvent.h”和“DllEvent.lib”文件复制到“CallDllEvent”项目的文件夹中。
13. 打开菜单“项目”->“设置”->“链接”,在“对象/库模块”中输入“DllEvent.lib”。
注意:确保在左侧面板上突出显示“CallDllEvent”项目。
14. 打开菜单“项目”->“设置”->“后期生成步骤”,创建一个新命令作为“copy ..\DllEvent\debug\DllEvent.dll debug\”。 这样,您无需手动将“DllEvent.dll”复制到“CallDllEvent”项目的 debug 文件夹。 编译项目时,系统会自动将此 dll 文件复制到指定的文件夹。 这非常有用。
注意:“..\”表示上一级文件夹。
15. 打开“CallDllEventDlg.h”文件,输入“#include "DllEvent.h"”语句。
16. 打开菜单“生成”->“全部重新生成”以生成这两个项目。 您可以看到两个项目都将被编译。
17. 单击菜单“生成”->“执行 CallDllEvent.exe”。 在对话框中,单击“Call Dll”按钮,它将弹出如下所示的消息框。
摘要
总之,此案例的整个过程如下所示。
OnCalldll -> SetEventCallback -> FireEvent -> OnEvent -> HandleEvent
如果您发现任何错误,请发布或通过电子邮件发送给我。 谢谢。
历史
1. 2008-6-13 上传了原始版本。
2. 2008-6-14 添加了一个图表并调整了另外 2 个图形。