/*
{ TResourceStream }
Convert by wfh,from Delphi Classes.pas
*/
class CResourceStream
{
private:
HRSRC HResInfo;
LPVOID HGlobal;
INT64 m_int64Size;
LPVOID m_Ptr;
void Initialize(HINSTANCE Instance,LPCSTR Name,LPCSTR ResType,BOOL FromID);
void SetPointer(LPVOID Ptr,INT64 Size);
public:
CResourceStream(HINSTANCE Instance, LPCSTR ResName, LPSTR ResType);
CResourceStream(HINSTANCE Instance, int ResID, LPSTR ResType);
virtual ~CResourceStream();
INT64 Write(LPCSTR Buffer,INT64 Count);
void SaveToFile(LPCSTR FileName);
};
//////////////////////////////////////////////////////////////////////////
CResourceStream::CResourceStream(HINSTANCE Instance,LPCSTR ResName,LPSTR ResType)
{
Initialize(Instance, ResName, ResType, FALSE);
}
CResourceStream::CResourceStream(HINSTANCE Instance,int ResID,LPSTR ResType)
{
CString strResID;
strResID.Format("%s",ResID);
Initialize(Instance, strResID, ResType, TRUE);
}
CResourceStream::~CResourceStream()
{
UnlockResource(HGlobal);
FreeResource(HGlobal);
//inherited Destroy;
}
void CResourceStream::Initialize(HINSTANCE Instance,LPCSTR Name,LPCSTR ResType,BOOL FromID)
{
m_Ptr=NULL;
m_int64Size=0;
HResInfo = FindResource(Instance, Name, ResType);
if (HResInfo == NULL)
{
TRACE("ERROR Can't Find Resource");
return;
}
HGlobal = LoadResource(Instance, HResInfo);
if (HGlobal == NULL)
{
TRACE("Error Can't Load Resource");
return;
}
SetPointer(LockResource(HGlobal), SizeofResource(Instance, HResInfo));
}
void CResourceStream::SetPointer(LPVOID Ptr,INT64 Size)
{
m_Ptr=Ptr;
m_int64Size=Size;
}
INT64 CResourceStream::Write(LPCSTR Buffer,INT64 Count)
{
//throw EStreamError.CreateRes(@SCantWriteResourceStreamError);
ASSERT(NULL);
return 0;
}
void CResourceStream::SaveToFile(LPCSTR FileName)
{
HANDLE hFile=CreateFile(FileName,
GENERIC_READ|GENERIC_WRITE,
FILE_SHARE_WRITE,NULL,
CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
NULL);
if(hFile==INVALID_HANDLE_VALUE)
{
TRACE("CreateFile() Failed");
return;
}
DWORD dwWritten;
WriteFile(hFile,m_Ptr,(DWORD)m_int64Size,&dwWritten,NULL);
CloseHandle(hFile);
}
范例:
用户可以在VC++工程中导入某个文件到资源文件,如NotePad.exe,资源类型类型名称"EXEFILE",资源的ID为"IDR_NOTEPAD"。那么将从资源文件生成Notepad.exe程序代码如下
CResourceStream resourceStream(AfxGetInstanceHandle(),"IDR_NOTEPAD","EXEFILE");
resourceStream.SaveToFile("Notepad.exe");