Visual C++ 回调函数示例 已翻译 100%

oschina 投递于 2013/02/06 09:26 (共 2 段, 翻译完成于 02-06)
阅读 6735
收藏 26
0
加载中

设想你的应用需要加载一个 DLL 库,这个 DLL 可能是你自己开发的或者是第三方的,而且你的应用依赖该 DLL 来获取一些数据。大多数 DLL 都提供了 APIs 用于执行特定的函数并返回相应值。

调用 DLL 的 API 过程是比较占用资源的,你可能需要增加额外的效果来运行某些调度器。此外,无效的返回数据导致无法保证 API 返回正确的值。

为了降低负载,我们可以创建一个回调函数,并注册到 DLL 中。在这个例子中,我们不需要创建调度器来定期调用 DLL 的 API。而是 DLL 在需要的时候调用回调函数并在数据有效时触发应用程序。

该教程将告诉你如何创建一个回调函数并注册到 DLL 中。

Visual C++ Callback Function Example

红薯
红薯
翻译于 2013/02/06 09:42
2
解决方案
  1. 创建一个 Win32 控制台应用项目,名称为 “SampleCallback”. 请确认是控制台类型的应用项目
  2. 添加一个新的 Win32 应用项目到同一个解决方案中,名为  “callbackproc”. 确认应用项目类型是 DLL

    Visual C++ Callback Function Example
  3. callbackproc 项目
  4. 打开 callbackproc.h 文件,并输入下列代码:
    #include <string>
    
    #ifdef CALLBACKPROC_EXPORTS
    #define CALLBACKPROC_API __declspec(dllexport)
    #else
    #define CALLBACKPROC_API __declspec(dllimport)
    #endif
    
    // our sample callback will only take 1 string parameter
    typedef void (CALLBACK * fnCallBackFunc)(std::string value);
    
    // marked as extern "C" to avoid name mangling issue
    extern "C"
    {
    	//this is the export function for subscriber to register the callback function
    	CALLBACKPROC_API void Register_Callback(fnCallBackFunc func);
    }
  5. 打开 callbackproc.cpp 文件并输入下列代码
    #include "stdafx.h"
    #include "callbackproc.h"
    #include <sstream>
    
    // This is an example of an exported function.
    CALLBACKPROC_API void Register_Callback(fnCallBackFunc func)
    {
    	int count = 0;
    
    	// let's send 10 messages to the subscriber
    	while(count < 10)
    	{
    		// format the message
    		std::stringstream msg;
    		msg << "Message #" << count;
    
    		// call the callback function
    		func(msg.str());
    
    		count++;
    
    		// Sleep for 2 seconds
    		Sleep(2000);
    	}
    }
  6. 打开项目属性界面
  7. 确认目录名 “..\callbackproc” ,位置:C/C++->General->Additional Include Directories.
  8. 确认目录名 “..\callbackproc\debug” ,位置:Linker->General->Additional Libraries Directories. 在这个教程中我们使用 Debug 构建,你可根据需要自行修改
  9. 确认 “callbackproc.lib” 文件,位置:Linker->Input->Additional Dependencies
  10. 打开 CallbackSample.cpp 文件,并输入如下代码:
    #include "stdafx.h"
    #include <windows.h>
    #include <string>
    #include <windows.h>
    #include <string>
    
    #include "callbackproc.h"
    
    // Callback function to print message receive from DLL
    void CALLBACK MyCallbackFunc(std::string value)
    {
    	printf("callback: %s\n", value.c_str());
    }
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    	// Register the callback to the DLL
    	Register_Callback(MyCallbackFunc);
    	
    	return 0;
    }
  11. 当你尝试编译项目时需要注意 callbackproc 项目必须先编译,因为 CallbackSample 依赖于它
  12. 编译 CallbackSample 项目并运行,你会看到如下的输出信息

下载源码: CallbackSample.zip


红薯
红薯
翻译于 2013/02/06 09:37
3
本文中的所有译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接。
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。
加载中

评论(18)

crossmix
crossmix
c+文章多
crossmix
crossmix
ok
YehMatthew
YehMatthew
c++的虚函数不就是这个回调的功能吗?
葛世超ChicoGe
葛世超ChicoGe

引用来自“mental”的评论

引用来自“zhuang”的评论

DLL中竟然暴露 std::string, 当然如果使用相同的编译器,相同编译环境可以使用.否则就 阿门了.

对, DLL函数接口参数类型要谨慎,尤其是做第三方插件

是呀是呀,传个引用什么的最喜欢了。
sin7777
sin7777
都快忘了 西加加了 现在只搞C 觉的 C++ 类做封装还是不错的 纯c 指针用的太多了
xxdd
xxdd
顶,难得c++,难得vc,难得vs2010
独-奏
独-奏
@红薯 大哥还没放假啊~
mental
mental

引用来自“zhuang”的评论

DLL中竟然暴露 std::string, 当然如果使用相同的编译器,相同编译环境可以使用.否则就 阿门了.

对, DLL函数接口参数类型要谨慎,尤其是做第三方插件
zhuang
zhuang
DLL中竟然暴露 std::string, 当然如果使用相同的编译器,相同编译环境可以使用.否则就 阿门了.
晃心竹
晃心竹
函数指针么
返回顶部
顶部