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

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > c/c++ >内容正文

c/c++

VC中使用自定义资源

發(fā)布時(shí)間:2024/1/1 c/c++ 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 VC中使用自定义资源 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

前言 

在VC環(huán)境中除了我們所常用的Dialog、Menu和Bitmap等標(biāo)準(zhǔn)資源類(lèi)型之外,它還支持自定義資源類(lèi)型(Custom Resource),我們自定義資源類(lèi)型能做些什么呢?呵呵,用處多多。

1.??????默認(rèn)的皮膚壓縮包或語(yǔ)言包。一些支持換膚的軟件特別是一些媒體播放器常常有自定義的皮膚文件(你可以嘗試將Media Player或千千靜聽(tīng)等軟件的Skins目錄下的文件的擴(kuò)展名改為.zip,然后使用WinZip打開(kāi)看一下),但為了防止Skin文件丟失導(dǎo)致軟件無(wú) 法顯示,他們常常會(huì)在EXE文件中內(nèi)置一套Skin作為默認(rèn)的皮膚文件。同樣,一些支持多語(yǔ)言的EXE文件中存在默認(rèn)語(yǔ)言包也是這個(gè)道理(當(dāng)然也可以使用 "String Table"資源類(lèi)型);

2.??????做為一些病毒/木馬程序的寄生方式。如果不小心執(zhí)行了帶有病毒/木馬的程序,它們會(huì)在你運(yùn)行時(shí)釋放出病毒/木馬文件。當(dāng)然許多病毒是將自身寫(xiě)入PE文件頭來(lái)實(shí)現(xiàn);

3.??????合并EXE與它所需要的DLL文件。出于某些原因程序作者有時(shí)可能需要將DLL文件嵌入到可執(zhí)行的EXE文件中,這可以通過(guò)使用自定義資源來(lái)實(shí)現(xiàn);

4.??????其它需要在程序中播放一個(gè)AVI動(dòng)畫(huà)等等,都可以通過(guò)將二進(jìn)制的數(shù)據(jù)文件作為自定義資源加入到可執(zhí)行文件中來(lái)實(shí)現(xiàn);


添加資源

  添加資源時(shí)選擇自定義,IDE會(huì)為你生成一個(gè)新的二進(jìn)制資源,然后你就可以將你已經(jīng)存在的二進(jìn)制文件作為自定義的資源類(lèi)型導(dǎo)入到項(xiàng)目中來(lái)了。

使用資源

  要使用自定義資源,我們可能要用到的幾個(gè)API函數(shù)有FindResource、LoadResource和LockResource等,這里每一個(gè)函數(shù)的返回值分別作為下一個(gè)函數(shù)的參數(shù),我來(lái)簡(jiǎn)要介紹一下。

FindResource用來(lái)在一個(gè)指定的模塊中定位所指定的資源: HRSRC FindResource (HMODULE hModule, //包含所需資源的模塊句柄,如果是程序本身,可以置為NULLLPCTSTR lpName, //可以是資源名稱(chēng)或資源IDLPCTSTR lpType //資源類(lèi)型,在這里也就是我們自己指定的資源類(lèi)型 ); LoadResource用來(lái)將所指定的資源加載到內(nèi)存當(dāng)中; HGLOBAL LoadResource (HMODULE hModule, //模塊句柄,同上HRSRC hResInfo //需要加載的資源句柄,這里也就是FindResource的返回值 );LockResource用來(lái)鎖定內(nèi)存中的資源數(shù)據(jù)塊,它的返回值也就是我們要使用的直系指向資源數(shù)據(jù)的內(nèi)存指針; LPVOID LockResource (HGLOBAL hResData //指向內(nèi)存中要鎖定的資源數(shù)據(jù)塊,這里也就是LoadResource的返回值 );

  另外我們還需要用SizeofResource來(lái)確定資源的尺寸,我們?cè)诓僮髻Y源時(shí)要用到它。

函數(shù)原型:DWORD SizeofResource(HMODULE hModule,HRSRC hReslnfo); 參數(shù): hModule:包合資源的可執(zhí)行文件模塊的句柄,如果是程序本身,可以置為NULL hReslnfo:資源句柄。此句柄必須由函數(shù)FindResource或FindResourceEx來(lái)創(chuàng)建。 返回值:如果函數(shù)運(yùn)行成功,返回值資源的字節(jié)數(shù)。如果函數(shù)運(yùn)行失敗,返回值為零。若想獲得更多的錯(cuò)誤信息,請(qǐng)調(diào)用GetLastError函數(shù)。

?在FindResource函數(shù)中經(jīng)常用到宏MAKEINTERSOURCE來(lái)獲得資源名稱(chēng)參數(shù)(LPCTSTR lpName),因?yàn)樵搮?shù)需要LPCTSTR類(lèi)型參數(shù)。MAKEINTERSOURCE是一個(gè)資源名轉(zhuǎn)換的宏,這個(gè)宏是把一個(gè)數(shù)字類(lèi)型轉(zhuǎn)換成字符指針類(lèi)型的宏,它不存在釋放的問(wèn)題。

它僅僅是把一個(gè)"數(shù)字形ID",轉(zhuǎn)化為"字符串".但是執(zhí)行前后,輸入的數(shù)據(jù)的內(nèi)容和長(zhǎng)度是不變的!它只不過(guò)就是C語(yǔ)言里面"強(qiáng)制類(lèi)型轉(zhuǎn)換"而已.

用這個(gè)宏的主要原因是有的資源是用序號(hào)定義的,而不是字符串.所以要把數(shù)字轉(zhuǎn)換成字符串指針,然后再傳遞給LoadResource之類(lèi)的函數(shù),這樣才加載了資源.

要釋放資源(用LoadResource加載的)可以調(diào)用FreeResource函數(shù)把LoadResource返回的指針傳遞給FreeResource.


在資源使用完畢后我們不需要使用 UnlockResource和FreeResource來(lái)手動(dòng)地釋放資源,因?yàn)樗鼈兌际?6位Windows遺留下來(lái)的,在Win32中,在使用完畢后系統(tǒng)會(huì)自動(dòng)回收。它們的使用很簡(jiǎn)單,大致上是這個(gè)樣子的:

BOOL UseCustomResource() {//定位我們的自定義資源,這里因?yàn)槲覀兪菑谋灸K定位資源,所以將句柄簡(jiǎn)單地置為NULL即可HRSRC hRsrc = Findresource(null, MAKEINTRESOURCE(ITEMID), TEXT("MyType"));if (NULL == hRsrc)return FALSE;//獲取資源的大小DWORD dwSize = SizeofResource(NULL, hRsrc);if (0 == dwSize)return FALSE;//加載資源HGLOBAL hGlobal = LoadResource(NULL, hRsrc);if (NULL == hGlobal)return FALSE;//鎖定資源LPVOID pBuffer = LockResource(hGlobal);if (NULL == pBuffer)return FALSE;//我們用剛才得到的pBuffer和dwSize來(lái)做一些需要的事情??梢灾苯釉趦?nèi)存中使//用,也可以寫(xiě)入到硬盤(pán)文件。這里我們簡(jiǎn)單的寫(xiě)入到硬盤(pán)文件,如果我們的自定//義資源是作為嵌入DLL來(lái)應(yīng)用,情況可能要復(fù)雜一些。BOOL bRt = FALSE;FILE* fp = _tfopen(_T("demo.exe"), _T("wb"));if (fp != NULL){if (dwSize == fwrite(pBuffer, sizeof(char), dwSize, fp))bRt = TRUE;fclose(fp);} //FreeResource(hGlobal);return bRt;


使用實(shí)例

功能:尋找軟件中的資源(type:HELP_FILE, ?Id:IDR_HELP_FILE1),并在本地臨時(shí)文件夾temp中生成對(duì)應(yīng)資源的文件(涉及查找資源中文件、加載資源到內(nèi)存、得到資源大小、將資源內(nèi)存寫(xiě)入文件),并打開(kāi)文件

</pre><p><pre name="code" class="cpp">CString szPath, szDir; TCHAR buf[MAX_PATH]; szPath.Empty(); szDir.Empty();GetTempPath(MAX_PATH, buf); szDir = buf; szPath = szDir + _T("Help.pdf");if (GFun::ReleaseRes(szPath, (WORD)IDR_HELP_FILE1, _T("HELP_FILE")) == TRUE) {ShellExecute(NULL, _T("OPEN"), szPath, NULL, szDir, SW_SHOWNORMAL); }bool ReleaseRes(CString strFileName, WORD wResID, CString strFileType) {// 資源大小 DWORD dwWrite = 0;// 創(chuàng)建文件 HANDLE hFile = CreateFile(strFileName, GENERIC_WRITE, FILE_SHARE_WRITE, NULL,CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);if (hFile == INVALID_HANDLE_VALUE){return false;}// 查找資源文件中、加載資源到內(nèi)存、得到資源大小 HRSRC hrsc = FindResource(NULL, MAKEINTRESOURCE(wResID), strFileType);HGLOBAL hG = LoadResource(NULL, hrsc);DWORD dwSize = SizeofResource(NULL, hrsc);// 寫(xiě)入文件 WriteFile(hFile, hG, dwSize, &dwWrite, NULL);CloseHandle(hFile);return true; }


說(shuō)明:

1、GetTempPath的功能是獲取系統(tǒng)當(dāng)前用戶(hù)的臨時(shí)文件夾路徑,如:C:\Users\XXX\AppData\Local\Temp

2、ShellExecute的功能是運(yùn)行一個(gè)外部程序(或者是打開(kāi)一個(gè)已注冊(cè)的文件、打開(kāi)一個(gè)目錄、打印一個(gè)文件等等),并對(duì)外部程序有一定的控制。



總結(jié)

以上是生活随笔為你收集整理的VC中使用自定义资源的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 爱福利视频网 | 欧美一级淫片aaaaaa | 亚洲视频在线观看网址 | 日本一区成人 | 已满18岁免费观看电视连续剧 | 久久精品国产露脸对白 | www.三级 | 欧美色图激情小说 | 精品黄色片| 精品小视频 | 在线看毛片网站 | 日韩av手机在线观看 | 日韩精品无码一区二区三区 | 日本黄色一区二区三区 | 亚洲码视频 | 在线视频亚洲色图 | 奇米影视中文字幕 | 一本色道久久综合狠狠躁 | 91精品国产综合久久国产大片 | 国产午夜无码精品免费看奶水 | 欧美在线www | 特黄一区二区三区 | a级黄毛片 | 亚洲精品综合精品自拍 | 色爱综合 | 狠狠人妻久久久久久综合蜜桃 | 亚洲色图图 | 欧美国产精品一区二区三区 | 亚洲视频www | 成人深夜视频 | 欧美韩一区 | 色在线免费| 特黄aaaaaaa片免费视频 | 影音先锋一区 | 天天做夜夜爽 | 免费黄色网址在线 | 狠狠亚洲| 五月婷婷狠狠干 | 91福利网址| 成人乱人乱一区二区三区一级视频 | a一级视频 | japanese在线| 久久免费看少妇 | 性感美女被爆操 | 亚洲精品www久久久久久 | 蜜美杏av | 欧美一区二区三区大屁股撅起来 | www.色综合 | 免费成人看片 | 蜜臀av88| 亚洲码欧美码一区二区三区 | 欧美xxxx黑人又粗又长密月 | 午夜在线观看视频网站 | 午夜鲁鲁 | 香蕉久久国产av一区二区 | 黄色网久久 | 日韩久久久久久久久久久 | 久久一区二区三区四区五区 | 国内精品视频一区二区三区 | 韩日黄色片 | 欧美色涩在线第一页 | 亚洲AV无码成人精品区东京热 | 91视频免费看片 | 国产精品成人久久久久久久 | 五月婷激情 | 99久免费精品视频在线观78 | 在线观看毛片网站 | 日韩欧美一区二区在线观看 | 欧美黄色免费大片 | 日韩深夜视频 | 涩涩屋视频在线观看 | 激情伊人 | www.好了av | 国产第一页在线观看 | 狠狠ri| 在线免费观看一区二区三区 | 亚洲精品在线观看免费 | 特级毛片在线观看 | 日本簧片在线观看 | 欧美 日韩 国产 成人 在线观看 | 四虎一区二区 | av一级黄色 | 欧美一级色 | 精品一区二区三区四区五区六区 | 色屁屁www | 国产欧美一区二区精品性色99 | 很黄很色的视频 | 97色资源 | 波多野结衣视频在线看 | 高清一区在线观看 | 黄色三级大片 | 中文字幕一区二区三区四区视频 | 久久第一页 | 亚洲欧美综合一区 | 中文字幕高清一区 | 伊人999| www.com色 | 国产女人毛片 | 91九色国产|