65.9K
CodeProject 正在变化。 阅读更多。
Home

如何在 DLL 中创建事件?

starIconstarIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIcon

2.14/5 (8投票s)

2008年6月13日

CPOL

3分钟阅读

viewsIcon

49534

downloadIcon

1188

这个示例演示了如何在 DLL 文件中创建事件,以及随后如何从客户端程序调用此事件。


引言

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

图表
diagram.JPG

使用代码

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”)。
dependencies2.JPG


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”按钮,它将弹出如下所示的消息框。
Result2.JPG


摘要

总之,此案例的整个过程如下所示。

OnCalldll -> SetEventCallback -> FireEvent -> OnEvent -> HandleEvent

如果您发现任何错误,请发布或通过电子邮件发送给我。 谢谢。

历史

1. 2008-6-13 上传了原始版本。
2. 2008-6-14 添加了一个图表并调整了另外 2 个图形。

© . All rights reserved.