C/C++中Windows API 简单的(Callback)回调机制
生活随笔
收集整理的這篇文章主要介紹了
C/C++中Windows API 简单的(Callback)回调机制
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
首先來說說什么是調用和回調
當一個程序調用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)回调机制的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HTML期末作业-美食网站
- 下一篇: Java高级语法笔记-多个异常处理