资源操作相关函数

最近遇到了这样个问题:编程实现修改EXE程序的图标,比如把一个EXE程序图标改为pdf、word等图标。。。。。
问题终于解决了,其中最主要的就是涉及到资源函数的相应操作。故发此文。。。。。。。。。

1、FindResource函数:该函数确定指定模块中指定类型和名称的资源所在位置。
HRSRC FindResource(
HMODULE hModule,  //资源所在EXE、DLL模块句柄;
LPCWSTR lpName,  //资源名称
LPCWSTR lpType );  //资源类型
返回值:成功则返回资源句柄,将此句柄传递给LoadResource函数。
注意:如果参数lpType或lpName的高字节为O,那么其低字节中所给定的资源的类

型或名称标识说明。另外,这些参数指向以NULL为终止符的字符串。字符串的第

一个字符是#,后面的字符表示十进制数来表示源类型或名称的整数标识符。例

如。字符串"#258"表示整数标识符258。
  如果用整数标识符替代名称提交资源,用程序将减少所需的内存容量。
  当使用完加速器表,位图,光标,图标,或是菜单后,可以通过调用下表所

列举的函数释放内存。加速器表:DestroyAcceleratorTable;位图:

DeleteObject;光标:DestroyCursor;图标:Destroylcon;菜单DestroyMenu。
  当过程创建资源终止时,系统将自动删除这些资源。然而通过调用适当的函

数可以保留内存,减少过程中工作设置所需的空间大小。
  应用程序可以使用FindResource函数去查找任何种类资源,但是这个函数只

有在应用程序并发调用LoadLibray和LockResource函数来存取二进制资源时才被

使用。
  如果想立即使用某一资源,应用程序将使用下面详细资源函数列表中某一函

数去查找装载所需资源,FormatMessage:装裁且格式化信息表接口:

LoadAccclerators:装载加速器表;LoadBltmap:装载位图资源;LoadCursor:

装载光标资源;Loadlcon:装载图标资源;
  LoadMenu:装载菜单资源;LoadString:装载字符串表资源。
  例如,应用程序可以使用Loadlcon函数装载某一图标以在屏幕上显示。但是

,如果是装载某一图标为了将它的数据复制到另一个应用程序中,那么这个应用

程序就应该使用FindResource和LoadResource函数。
  字符串资源存储在由若干部分组成的某区域,每部分有16个字符串。每部分

的字符串是按统一计数方式排列的有序队形式存储的。
  TheLoadstring函数将从相应的区域中摘取字符串资源。
  参数hModule不能为NULL句柄。
  参数lpName不支持ID为零的资源,即FindResource(h,o,t)不能按预期工

作。
  不可能在IpTyPe参数中传递RT_ANICURSOR或RT_ANllCON的值。
还有一个类似函数:FindResourceEx函数
HRSRC FindResourceEx(
  HMODULE hModule,
  LPCTSTR lpType, 
  LPCTSTR lpName, 
  WORD wLanguage   // 资源语言
);

2、LoadResource函数:加载指定资源到全局内存空间中。
HGLOBAL LoadResource(
  HMODULE hModule, // EXE、DLL等可执行文件句柄
  HRSRC hResInfo   // 资源句柄,可由FindResource函数返回
);
返回值:如果函数运行成功,返回值是相关资源的数据的句柄。
 注意:LoadResource的返回类型是向后兼容的HGLOBAL型,而不是因为函数返回

一个全局存储块句柄。不要传递这个句柄给函数GlobalLock或GlobalFree。为了

得到更多资源数据信息,请调用LockResource函数。
  当使用完资源后,必须通过调用函数以释放加速器表、位图、光标、图标以

及菜单所占的内存资源:加速器表:DestroyAcceleratorTable;位图:

DeleteObject;光标:DestroyCursor;图标:Destroylcon;菜单:DestroyMenu


  当过程创建终止时,系统将自动删除这些资源。但是调用相关函数也可以保

留内存减少过程的工作设置所占空间。

3、LockResource函数:返回资源在内存中的地址。
LPVOID LockResource(
  HGLOBAL hResData   // 由LoadResource函数返回
);
返回值:如果被装载的资源被锁住了,返回值是资源第一个字节的指针;否则为

NULL。
注意:通过使用函数FindResource或FindResourceEx返回句柄试图锁住资源,不

再工作。可以返回一个错误的数据和任意数据的指针。

4、SizeofResource函数:获取指定资源的大小。
DWORD SizeofResource(
  HMODULE hModule, // 包含资源的可执行模块句柄
  HRSRC hResInfo   // 资源句柄,由FindResource(Ex)返回
);
返回值:返回资源大小的字节数。

5、BeginUpdateResource函数:返回一个可被UpdateResource函数使用的句柄以

便在一个可执行文件中增加、删除或替换资源。
HANDLE BeginUpdateResource(
  LPCTSTR pFileName,     // 被更新资源的32位可执行文件的文件名
  BOOL bDeleteExistingResources  // 是否删除现有资源选项
);
返回值:如果此函数运行成功,其值将通过使用UpdateResource和

EndUpdateResource函数返回一个句柄。如果被指定的文件不是一个可执行文件,

或者可执行文件已被装载,或者文件不存在,或是文件不能被打开写入时,则返

回值为空。

6、UpdateResource函数:增加,删除,或替代某可执行文件中的资源。
BOOL UpdateResource(
  HANDLE hUpdate, // 由BeginUpdateResource返回
  LPCTSTR lpType, // 资源类型
  LPCTSTR lpName, // 资源名称
  WORD wLanguage, // 语言标志
  LPVOID lpData,  // 资源数据由LockResource返回
  DWORD cbData    // 资源数据大小,可由SizeofResource返回
);
返回值:如果函数运行成功,返回值为非零;如果函数运行失败,返回值为零。
注意:应用程序重复使用UpdateResource去改变资源数据。每次UpdateResource

调用都要占用系统内部的一个增加、删除、替代的列表,而实际上并没有将数据

写到可执行文件中。应用程序必须通过使用EndUpdateResource函数将每次积累的

变化写入可执行文件中。

7、EndUpdateResource函数:终止在可执行文件中的资源更新。
BOOL EndUpdateResource(
  HANDLE hUpdate, // 资源更新句柄,通过BeginUpdateResource函数返回。
  BOOL fDiscard   // 如果此参数为TRUE,则在可执行文件中无变化;如果此参

      数为FALSE,则在可执行文件中写入变化。
);
返回值:如果函数运行成功,并且通过调用UpdateResource函数指定的不断积聚

的资源修正内容被写入指定的可执行文件,那么其返回值为非零。如果函数运行

失败,其返回值为零。

8、EnumResourceNames函数:为每个指定类型的资源搜寻模块,并将每个查找到

的资源名称传递给回调函数。
BOOL EnumResourceNames(
  HMODULE hModule,             // 包含资源的可执行模块句柄
  LPCTSTR lpszType,            // 资源类型
  ENUMRESNAMEPROC lpEnumFunc,  // 回调函数
  LONG_PTR lParam              // 指定一个申请定义参数值传递给响应函数
);
返回值:若函数运行成功,则退回非零值;若函数运行失败,则退回零值。
注意:函数将连续列举出资源名称,直到响应函数返回False值或全部的资源名称

均被列举完毕。

9、EnumResNameProc函数:一个用户定义的和EnumResourceNames函数一起使用的回调函数。
BOOL CALLBACK EnumResNameProc(
  HMODULE hModule,   // 包含资源的可执行模块句柄
  LPCTSTR lpszType,  // 资源类型
  LPTSTR lpszName,   // 回调函数
  LONG_PTR lParam    // 指定一个申请定义参数值传递给响应函数
);
返回值:此响应函数返回值为TRUE时将继续列举;否则,当返回值为FALSE时将停止列举。
注意:应用程序必须通过向EnumResourceNames函数传递这个函数的地址来注册。

10、EnumResourceTypes 函数:资源搜寻模块并且将它找到的每个资源类型传递给用户定义的回调函数。
BOOL EnumResourceTypes(
  HMODULE hModule,             // 包含资源的可执行模块句柄
  ENUMRESTYPEPROC lpEnumFunc,  // 回调函数
  LONG_PTR lParam              // 申请一个定义参数值传递给响应函数
);
返回值:若函数运行成功,则返回非零值;若函数运行失败,则返回零值。
注意:函数将连续列举出资源名称,直到响应函数返回False值或全部的资源名称均被列举完毕。
11、EnumResTyPeProc函数:用户定义的和EnumResourceTypes函数一起使用的回调函数。
BOOL CALLBACK EnumResTypeProc(
  HMODULE hModule,  // 包含资源可执行模块句柄
  LPTSTR lpszType,  // 资源类型
  LONG_PTR lParam   // 指定一个申请定义参数值
);
返回值:若响应函数返回TRUE值则继续列举;否则,返回FALSE值时将停止列举。
注意:应用程序必须通过将函数的地址传递给EnumResourceTypes函数来注册。

12、EnumResourceLanguages函数:资源搜索模块并向回调函数传递所搜寻到的每种资源语言。
BOOL EnumResourceLanguages(
  HMODULE hModule,             // 包含资源的可执行模块句柄
  LPCTSTR lpType,              // 资源类型
  LPCTSTR lpName,              // 资源名称
  ENUMRESLANGPROC lpEnumFunc,  // 回调函数
  LONG_PTR lParam              // 回调定义值参数
);
返回值:若函数运行成功,则返回非零值;若函数运行失败,则返回零值。
注意:EnumResourceLanguages函数将连续列举出语言资源,直到响应函数返回False值或全部的语言资源均被列举完毕。
13、EnumResLangProc函数:用户定义的和EnumResourceLanguages函数一起使用的回调函数。
BOOL CALLBACK EnumResLangProc(
  HANDLE hModule,    // 包含资源的可执行模块句柄
  LPCTSTR lpszType,  // 资源类型
  LPCTSTR lpszName,  // 资源名称
  WORD wIDLanguage,  // 语言ID
  LONG_PTR lParam    // 回调定义值参数
);
返回值:此响应函数返回值为TRUE时将继续列举:否则,当返回值为FALSE时将停止列举。
注意:应用程序必须通过向EnumResourceLanguages函数传递这个函数的地址来注册。

 



文章来自: 本站原创
Tags:
评论: 0 | 查看次数: 8001