资源操作相关函数及例子

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

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);

 

 

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿尔兹

如果觉得有用就推荐给你的朋友吧

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值