什么是Windows API
API:Application Programming Interface
應(yīng)用程序編程接口褥影,API的形式可以是函數(shù)或類
要操作文件,可以調(diào)用ANSI C API(標(biāo)準(zhǔn)C)中的fopen/fclose/fread/fwrite一系列函數(shù)
API有很多種换团,不一定要使用ANSI C宫蛆,也可以使用Windows API
Windows API:即Windows系統(tǒng)給程序開發(fā)人員提供的API艘包,又叫Windows SDK
某些功能函數(shù)必須由操作系統(tǒng)給我們提供
示例1-暫歇
#include<stdio.h>
int main()
{
for(int i=0;i<10;i++)
{
printf("get:%d\n",i);
}
return 0;
}
上面函數(shù)要求每隔一秒輸出一行,要用到Sleep函數(shù)卦尊,單位為毫秒舌厨,Sleep(1000)即為每隔一秒
#include<stdio.h>
#include<Windows.h>
int main()
{
for(int i=0;i<10;i++)
{
printf("get:%d\n",i);
Sleep(1000);
}
return 0;
}
示例2-精確計(jì)時(shí)
可以使用ANSI C提供的time.h的函數(shù)岂却,實(shí)時(shí)計(jì)算秒級的計(jì)時(shí)
#include<stdio.h>
#include<Windows.h>
#include<time.h>
//模擬一個業(yè)務(wù)裙椭,消耗5秒
void Later()
{
Sleep(5000);
}
int main()
{
time_t t1 = time(NULL);
Later();
time_t t2 = time(NULL);
//把time_t類型轉(zhuǎn)為int類型
int cost = (int)(t2-t1);
printf("%d\n",cost);
return 0;
}
當(dāng)需要更精確(毫秒級),用time.h就不合適了(上述代碼Sleep(50)時(shí)扫尺,輸出結(jié)果為0)
就要在Windows API中尋找
timeGetTime()自系統(tǒng)啟動以來的時(shí)間你雌,單位為毫秒
#include<stdio.h>
#include<Windows.h>
//聲明要使用的動態(tài)庫
#pragma comment(lib,"winmm.lib")
void Later()
{
Sleep(50);
}
int main()
{
unsigned int t1 = timeGetTime();
Later();
unsigned int t2 = timeGetTime();
printf("%d\n",t2-t1);
return 0;
}
MSDN的安裝與使用
每一個API的作者都會同時(shí)提供一份開發(fā)文檔二汛,在文檔中描述怎么使用API
MSDN:Windows API提供的開發(fā)文檔婿崭,可以查到每個函數(shù)的說明
MSDN里不但有Windows API肴颊,還有ANSI C和STL的說明
Windows API的封裝
Windows API的缺點(diǎn)
-
使用了非標(biāo)準(zhǔn)的類型
比如PINT,PVOID授瘦,LPCSTR竟宋,DWORD...
-
本身設(shè)計(jì)的可能不易于使用
比如提完,可以將API函數(shù)封裝成易于使用的class
封裝的原則
- 減少依賴性丘侠,不include太多頭文件或者使用太多庫
- 不適用非標(biāo)準(zhǔn)類型
- 一般使用面向?qū)ο蠓庋b
使用示例1-文件查找
要實(shí)現(xiàn)的功能
在C:\Windows\目錄下,查找所有*.exe文件
網(wǎng)上搜索要用哪一個API
msdn查看用法
-
寫測試代碼
#include <stdio.h> /* Windows API */ #include <Windows.h> int main() { const char* filter = "C:\\Windows\\*.exe"; WIN32_FIND_DATA info; HANDLE hFind = FindFirstFile(filter, &info); while(hFind != INVALID_HANDLE_VALUE) { printf("Got: %s \n", info.cFileName); if(! FindNextFile(hFind, &info)) break;; } FindClose(hFind); return 0; }
封裝