首先来说说什么是调用和回调

当一个程序调用windows API时的过程称为Call

当windows API调用程序里面的函数时这称之为Callback

下面举一个简单的例子来说明回调的用途

编写一个程序实现把resource/404dog.rar

复制到resource/404dog_copy.rar

当然这个文件只有几兆。

因此我们可以这么写:

#include <stdio.h>
#include <Windows.h>int main()
{const char* source = "resource/404dog.rar";const char* destination = "resource/404dog_copy.rar";printf("复制开始!\n");bool result = CopyFile(source, destination, FALSE);printf("运行结果:%s\n", result ? "成功" : "失败");getchar();return 0
}

其中CopyFile函数为windows API

下面对此函数做出一定的说明:

BOOL WINAPI CopyFile(_In_ LPCTSTR lpExistingFileName,_In_ LPCTSTR lpNewFileName,_In_ BOOL    bFailIfExists
);

大体上的意思就是为TRUE表示如果文件夹有同名的文件则无法复制,为FALSE则表面覆盖此文件。

下面是程序的演示和结果用截图来表示:

但是如果一个程序很大,有几个G的话,那不是控制台程序会卡住,造成假死。我们自己会知道这是假死

但用户不知道,所以微软更新了一个CopyFile函数叫CopyFileEx,可以理解为CopyFile的升级

下面来看看CopyFileEx函数

BOOL WINAPI CopyFileEx(_In_     LPCTSTR            lpExistingFileName,_In_     LPCTSTR            lpNewFileName,_In_opt_ LPPROGRESS_ROUTINE lpProgressRoutine,_In_opt_ LPVOID             lpData,_In_opt_ LPBOOL             pbCancel,_In_     DWORD              dwCopyFlags
);

传递callback函数的参数

第三个参数:就是回调函数

下面我们来看 CopyProgressRoutine的函数

DWORD CALLBACK CopyProgressRoutine(_In_     LARGE_INTEGER TotalFileSize,    // 文件总大小,字节_In_     LARGE_INTEGER TotalBytesTransferred,    // 已复制的文件大小,字节_In_     LARGE_INTEGER StreamSize,    // 当前流的总字节数            _In_     LARGE_INTEGER StreamBytesTransferred,    // 当前流已拷贝的字节数_In_     DWORD         dwStreamNumber,    // 当前流序号_In_     DWORD         dwCallbackReason,    // 回调函数的状态,见定义_In_     HANDLE        hSourceFile,     // 来源文件句柄_In_     HANDLE        hDestinationFile,    // 目标文件句柄_In_opt_ LPVOID        lpData    // CopyFileEx 函数传递过来的参数
);

所以下面的程序我们可以这么写:

#include <stdio.h>
#include <Windows.h>// 将LARGE_INTTEGER类型转成unsigned long long
unsigned long long translate(LARGE_INTEGER num)
{unsigned long long result = num.HighPart;result <<= 32;result += num.LowPart;return result;
}DWORD CALLBACK CopyProgress(LARGE_INTEGER TotalFileSize,LARGE_INTEGER TotalBytesTransferred,LARGE_INTEGER StreamSize,LARGE_INTEGER StreamBytesTransferred,DWORD dwStreamNumber,DWORD dwCallbackReason,HANDLE hSourceFile,HANDLE hDestionationFile,LPVOID IpData)
{unsigned long long total = translate(TotalFileSize);unsigned long long copied = translate(TotalBytesTransferred);printf("进度:%I64d/%I64d\n", copied, total);return PROGRESS_CONTINUE;
}int main()
{const char* source = "resource/demo.avi";const char* destination = "resource/demo_copy.avi";printf("开始复制...\n");bool result = CopyFileEx(source, destination, &CopyProgress, NULL, NULL, 0);getchar();return 0;
}

C/C++中Windows API 简单的(Callback)回调机制相关推荐

  1. VB中windows API StretchBlt,BitBlt的应用

    VB中windows API StretchBlt,BitBlt的应用 1.BitBlt函数 函数原型:Declare Function BitBlt Lib "gdi32" _ ...

  2. Windows API简单实例

    第一个:FindWindow根据窗口类名或窗口标题名来获得窗口的句柄,该函数返回窗口的句柄, 这个函数的定义是这样的 HWND WINAPI FindWindow(LPCSTR lpClassName ...

  3. 获取动态库中Windows API的地址(以ntdll.dll为例子)

    一.任务 打印Windows 2003中ntdll.dll的所有函数名及其地址. 二.流程 1.获取ntdll.dll的基址 (1)汇编代码 unsigned long addr;__asm{mov ...

  4. lua运行外部程序_Lua通过COM调用外部程序excel及调用windows api

    [在我接触JNA之前一直以为调用本地链接库函数的时候一定要借助JNI或者SWT来实现,一日中无意看到JNA,发现它也可以实现这类调用,于是下回来按网站上的例子试试了 还不错, 为了方便起见,最好安装l ...

  5. 在C#中调用windows API函数

    Api函数是构筑Windws应用程序的基石,每一种Windows应用程序开发工具,它提供的底层函数都间接或直接地调用了Windows API函数,同时为了实现功能扩展,一般也都提供了调用Windows ...

  6. 在c#中使用WINDOWS API(转)

    下面以C#为例简单介绍调用API的基本过程: 动态链接库函数的声明 动态链接库函数使用前必须声明,相对于VB,C#函数声明显得更加罗嗦,前者 通过 Api Viewer粘贴以后,可以直接使用,而后者则 ...

  7. C# 获得窗体句柄并发送消息(利用windows API可在不同进程中获取)

    C#使用Windows API获取窗口句柄控制其他程序窗口 编写程序模拟鼠标和键盘操作可以方便的实现你需要的功能,而不需要对方程序为你开放接口.比如,操作飞信定时发送短信等.我之前开发过飞信耗子,用的 ...

  8. C语言中pthread或Windows API在多线程编程中的基本应用

    文章目录 多线程概述 掌握多线程需要学习什么? 使用pthread.h实现多线程 使用Windows API实现多线程 使用threads.h实现多线程 参考资料 警告 由于我懒得写完,而且懂的也不是 ...

  9. c#调用windows api C#简单游戏外挂制作(以Warcraft Ⅲ为例)

    C#简单游戏外挂制作(以Warcraft Ⅲ为例) 网上有很多外挂制作的教程,大多是讲针对大型网络游戏的,主要包含一些抓包.反汇编.C++的知识综合.事实也如此,常见的外挂都是使用VC++写的,从来没 ...

最新文章

  1. 怎样删除usb计算机连接网络打印机驱动,惠普激光打印机安装驱动时报“跟这台计算机连接的一个 USB 设备运行不正...
  2. phpcms v9 数据库操作函数
  3. day24 面向对象与实例属性
  4. 从自我学习到深层网络
  5. JavaSE基础知识(5)—面向对象(Object类)
  6. Andoroid之BottomNavigationView右上角添加红点布局和自动跳转到底部具体第几个Tab
  7. 后来朋友选了伪原创工具下载这个词
  8. POJ3041_Asteroids
  9. [ZJOI2007]捉迷藏 (线段树,括号序列)
  10. KETTLE、spoon使用
  11. Peephole LSTM、GRU 实战
  12. directx修复工具_Diamond Cut Forensics 10(音频修复软件)分享
  13. 计算机能力考试合格证(5个模块),全国专业技术人员计算机应用能力考试
  14. 图片信息用浏览器显示:data:image/png;base64,+图片内容
  15. python交互编程模式_进入python交互模式的方法
  16. Linux使用tar命令进行磁带备份
  17. 超级简单的K线合成方法
  18. 时光相册 php,一周 App 派评:支持插图表格 iA Writer 4、智能修颜 Facetune 2、新海诚滤镜「时光相册」、脑力锻炼「大脑之旅」...
  19. python的self.boardx -= 5 什么意思_python小白求帮助
  20. Linux文件系统从磁盘读页面

热门文章

  1. 跟周报焦虑说拜拜!Excel打通FineBI,到底有多香
  2. 又跑回去拿的即时通讯
  3. 飞鸽传书是怎么就变成飞秋了的?
  4. VC++实现混合静态分裂视窗的方法
  5. 请假一天,回粤西老家买了套房
  6. 天津大学计算机非全日制录取名单,天津大学法律硕士拟录取名单(非全日制).xls...
  7. 经纬度坐标与距离的相互转换及其实现
  8. 中年发福谁之“过”?Science论文采用“双标水”法首次揭示全生命周期代谢规律...
  9. 45万例患者基因检测显示:NGS很难检测出七分之一的致病变异
  10. 这篇Nature子刊文章的蛋白组学数据PCA分析竟花费了我两天时间来重现|附全过程代码...