日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

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

發布時間:2025/3/15 c/c++ 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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)回调机制的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。