资源操作相关函数及例子

假设我们从资源中读取数据

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

 

发布了114 篇原创文章 · 获赞 120 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/alzzw/article/details/103801005