假设我们从资源中读取数据
FindResource函数
确定具有指定类型和名称的资源在指定模块中的位置。如果想指定语言可以用FindResourceEx
HMODULE hMdule = NULL;
LPSTR ResName = "";
LPSTR ResType = NULL;
HRSRC hRes = FindResource(hMdule,ResName,ResType);
if (NULL == hRes )
{
int err = GetLastError(); //获取错误码
return false;
}
函数原型:
HRSRC FindResource(
HMODULE hModule, //模块的句柄,其可移植可执行文件或随附的MUI文件包含资源,例如exe,dll文件等 如果此参数为NULL,则函数搜索用于创建当前进程的模块
LPCSTR lpName, //资源名称或资源ID
LPCSTR lpType //资源类型,在这里也就是我们自己指定的资源类型
);
返回值:
类型:HRSRC
如果函数成功,则返回值是指定资源的句柄。(这个句柄是传递给LoadResource函数的参数)
如果函数失败,则返回值为NULL。想要获取扩展的错误信息,可以调用GetLastError。
LoadRescource函数
加载资源,获取可用于获取指向内存中指定资源的第一个字节的指针的句柄
HGLOBAL hResData;
hResData = LoadResource(hModule,hRes);
函数原型:
HGLOBAL LoadResource(
HMODULE hModule, // 同上,模块句柄
HRSRC hResInfo //要加载的资源的句柄
);
返回值:
类型:HGLOBAL
如果函数成功,则返回值是与资源关联的数据的句柄。(这个句柄是传递给其他函数的参数)
如果函数失败,则返回值为NULL。想要获取扩展的错误信息,可以调用GetLastError。
SizeofResource函数
获取指定资源的大小(以字节为单位);
DWORD dwSize = SizeResource(hModule,hRes)
函数原型:
DWORD SizeofResource(
HMODULE hModule, //同上,模块句柄
HRSRC hResInfo //LoadResource返回的资源的句柄
);
返回值:
类型:DWORD
如果函数成功,则返回值是资源的字节数。
如果函数失败,则返回值为零。想要获取扩展的错误信息,可以调用GetLastError。
LockResource函数
LockResource用来锁定内存中的资源数据块
LPVOID pSrc= LockResource(hResData);
if(!pSrc){
FreeResource(hResData);
return -1;
}
函数原型:
LPVOID LockResource(
HGLOBAL hResData //要访问的资源的句柄
);
返回值:
类型:LPVOID
如果加载的资源可用,则返回值是指向资源第一个字节的指针;否则为NULL。
FreeResource函数
减少(减少1)已加载资源的引用计数。当引用计数达到零时,将释放资源占用的内存,但是[此功能已过时,仅支持向后兼容16位Windows。对于32位Windows应用程序,不必释放使用LoadResource加载的资源
函数原型:
BOOL FreeResource(
HGLOBAL hResData //要访问的资源的句柄
);
返回值:
类型:bool
如果函数成功,则返回值为零。
如果该函数失败,则返回值为非零,这表示尚未释放资源。
每次应用程序为资源调用LoadResource函数时,资源的引用计数都会增加(增加1)。
创建它们的进程终止时,系统会自动删除这些资源。但是,调用适当的功能可以节省内存
之后我们就可以用刚才得到的pSrc和dwSize来做一些需要的事情。可以直接在内存中使用,也可以写入到硬盘文件。这里我们简单的写入到硬盘文件,如果我们的自定义资源是作为嵌入DLL来应用,情况可能要复杂一些
例;
char* pBuffer;
CopyMemory(pBuffer,pSrc,dwSize);
关于Copymemory