1. 程式人生 > >[VC++]成功實現資源釋放(原創+轉載)

[VC++]成功實現資源釋放(原創+轉載)

       幾個月前我突然對資源釋放起了濃厚的興趣,於是在網上搜啊搜,內容幾乎被一篇文章這裡面的內容所壟斷了,由於文章上只給了部分原始碼,而其他的則需要10分CSDN分去下載,於是我就擱置了幾個月。       最近又想到這個東西,由於好奇心很重,我還是搜了一下,在http://www.cctry.com/thread-10129-1-1.html網址中找到了一個不用花錢的下載連結(你也可以點選這裡下載),於是我就開啟來看看,我沒學過MFC,對那些Dlg函式不感興趣,總算找到了最關鍵的原始碼(這一段是網上有的,我現在才知道那個人是把關鍵程式碼貼出來了):

/************************************************************************/
/* 函式說明:釋放資源中某型別的檔案
/* 參 數:新檔名、資源ID、資源型別
/* 返 回 值:成功返回TRUE,否則返回FALSE
/* By:Koma 2009.07.24 23:30
/************************************************************************/
BOOL ReleaseRes(CString strFileName,WORD wResID,CString strFileType)
{
// 資源大小
DWORD dwWrite=0;

// 建立檔案
HANDLE hFile = CreateFile(strFileName, GENERIC_WRITE,FILE_SHARE_WRITE,NULL,
CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
if ( hFile == INVALID_HANDLE_VALUE )
{
return FALSE;
}

// 查詢資原始檔中、載入資源到記憶體、得到資源大小
HRSRC hrsc = FindResource(NULL, MAKEINTRESOURCE(wResID), strFileType);
HGLOBAL hG = LoadResource(NULL, hrsc);
DWORD dwSize = SizeofResource( NULL, hrsc);

// 寫入檔案
WriteFile(hFile,hG,dwSize,&dwWrite,NULL);
CloseHandle( hFile );

// 啟動EXE或COPY等後續操作省略
// ......
return TRUE;
}

      新建一個空工程,不管是MFC的還是控制檯的,我選擇的是控制檯工程,然後再新建一個.h檔案,加入標頭檔案:       #include <stdio.h>       #include <windows.h>       #include <afxwin.h>       最好還加上:       #include "resource.h"       先不要問這個resource.h是哪裡來的。       現在,再新建一個.cpp檔案,輸入以下內容(複製也可以,[VC++]成功實現資源釋放(原創) - sunnysab - 奮鬥

#include "include.h"
int main()
{
if(ReleaseRes("ABC.exe",(WORD)IDR_EXE1,"EXE"))
{
printf("釋放檔案成功!\n");
}
else
{
printf("釋放檔案失敗!\n");
}
return 0;
}

      接下來就是資源的問題了,建立一個rc檔案(我是點選資源框中的“版本”,新建版本之後系統會自動為你建立一個rc檔案),結果如下: [VC++]成功實現資源釋放(原創) - sunnysab - 奮鬥       右擊空白處,點選“插入”出現以下介面。 [VC++]成功實現資源釋放(原創) - sunnysab - 奮鬥[VC++]成功實現資源釋放(原創) - sunnysab - 奮鬥 [VC++]成功實現資源釋放(原創) - sunnysab - 奮鬥       因為我們這次用EXE檔案做實驗,所以單擊“Dialog”,然後點選“引入”,這時會彈出一個檔案選擇框(關於如何實現檔案選擇,請參見這裡)       選好之後,在框中輸入“EXE”(引號不加),如“自定義資源型別”圖。點選確定。       這時候,rc中就會出現你剛才新增的EXE了。儲存rc檔案,並且將它新增到工程,再把resource.h新增到工程,然後就可以編譯執行,你就等著”釋放檔案成功“這個提示彈出吧! (注意事項)
      編譯沒問題,但執行後可能會出現 --------------------Configuration: 臨時 - Win32 Debug-------------------- Linking... nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __endthreadex nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __beginthreadex Debug/臨時.exe : fatal error LNK1120: 2 unresolved externals 執行 link.exe 時出錯. 臨時.exe - 1 error(s), 0 warning(s)       這個錯誤,解決方案你可以參考http://sunnysab.blog.163.com/blog/static/18037500920129273537269/