以下示例创建HAND.EXE文件中每个资源的列表。该列表写入RESINFO.TXT文件。
该代码演示如何加载可执行文件,创建一个写入资源信息的文件,并调用EnumResourceTypes函数将模块中发现的每种资源类型发送到应用程序定义的回调函数EnumTypesFunc.有关此类回调函数的信息,请参阅EnumResTypeProc.此回调函数使用EnumResourceNames函数将指定类型中的每个资源的名称传递给另一个应用程序定义的回调函数EnumNamesFunc.有关此类回调函数的信息,请参阅EnumResNameProc.EnumNamesFunc使用EnumResourceLanguages函数将指定类型和名称的每个资源的语言传递给第三个回调函数EnumLangsFunc.有关此类回调函数的信息,请参阅EnumResLangProc.EnumLangsFunc将有关指定类型,名称和语言的资源的信息写入RESINFO.TXT文件。
char szBuffer[80]; // EnumResourceTypes的打印缓冲区
DWORD cbWritten; //写入res的字节数。信息。文件
int cbString; // sprintf中的字符串长度
//声明回调函数。
BOOL EnumTypesFunc(
手柄hModule,
LPTSTR lpType,ru-Latn
LONG lParam);
BOOL EnumNamesFunc(
手柄hModule,
LPCTSTR lpType,cs
LPTSTR Lpanme,
LONG lParam);
BOOL EnumLangsFunc(
手柄hModule,
LPCTSTR lpType,cs
Lpaktstr Lpanme,hi-Latn
WORD wLang,
LONG lParam);
//加载要列出其资源的.EXE。
hExe = LoadLibrary("hand.exe");
if (hExe == NULL) {
ErrorHandler("Could not load .EXE.");
}
//创建一个包含资源信息的文件。
hFile = CreateFile("resinfo.txt", //文件名
GENERIC_READ | GENERIC_WRITE, //访问模式
0, //共享模式
(LPSECURITY_ATTRIBUTES) NULL, //没有安全
CREATE_ALWAYS, //创建标志
FILE_ATTRIBUTE_NORMAL, //文件属性
(HANDLE) NULL); //没有模板
if (hFile == INVALID_HANDLE_VALUE) {
ErrorHandler("Could not open file.");
}
//查找所有加载的文件的资源。
cbString = sprintf(szBuffer,
"The file contains the following resources:\n\n");
WriteFile(hFile, //文件保存资源信息。
szBuffer, //写入文件的内容
(DWORD) cbString, // szBuffer中的字节数
&cbWritten, //写入的字节数
NULL); //不重叠I / O
EnumResourceTypes(hExe, //模块句柄
(ENUMRESTYPEPROC)EnumTypesFunc, //回调函数
0); //额外的参数
//卸载资源所在的可执行文件
//枚举并关闭所创建的包含的文件
//资源信息。
FreeLibrary(hExe);
CloseHandle(hFile);
// FUNCTION:EnumTypesFunc(HANDLE,LPSTR,LONG)
//
//目的:资源类型回调
BOOL EnumTypesFunc(
HANDLE hModule, //模块句柄
LPTSTR lpType, //资源类型的地址
LONG lParam) //额外的参数,可以
//用于错误检查
{
int cbString;
//将资源类型写入资源信息文件。
//该类型可以是字符串或无符号十进制
//整数,所以打印前要测试。
if((ULONG)lpType & 0xFFFF0000){
cbString = sprintf(szBuffer, "Type: %s\n", lpType);
}
else {
cbString = sprintf(szBuffer, "Type: %u\n", (USHORT)lpType);
}
WriteFile(hFile,szBuffer,(DWORD)cbString,
&cbWritten, NULL);
//查找lpType类型的所有资源的名称。
EnumResourceNames(hModule,
lpType,
(ENUMRESNAMEPROC)EnumNamesFunc,
0);
return TRUE;
}
// FUNCTION:EnumNamesFunc(HANDLE,LPSTR,LPSTR,LONG)
//
//目的:资源名称回调
BOOL EnumNamesFunc(
HANDLE hModule, //模块句柄
LPCTSTR lpType, //资源类型的地址
LPTSTR lpName, //资源名称的地址
LONG lParam) //额外的参数,可以
//用于错误检查
{
int cbString;
//将资源名称写入资源信息文件。
//名称可以是字符串或无符号十进制
//整数,所以打印前要测试。
if((ULONG)lpName & 0xFFFF0000){
cbString = sprintf(szBuffer, "\tName: %s\n", lpName);
}
else {
cbString = sprintf(szBuffer, "\tName: %u\n",
(USHORT)lpName);
}
WriteFile(hFile,szBuffer,(DWORD)cbString,
&cbWritten, NULL);
//查找所有资源类型的语言
// lpType和name lpName。
EnumResourceLanguages(hModule,
lpType,
lpName,
(ENUMRESLANGPROC)EnumLangsFunc,
0);
return TRUE;
}
// FUNCTION:EnumLangsFunc(HANDLE,LPSTR,LPSTR,WORD,LONG)
//
//目的:资源语言回调
BOOL EnumLangsFunc(
HANDLE hModule, //模块句柄
LPCTSTR lpType, //资源类型的地址
LPCTSTR lpName, //资源名称的地址
WORD wLang, //资源语言
LONG lParam) //额外的参数,可以
用于错误检查
{
HANDLE hResInfo;
char szBuffer[80];
int cbString = 0;
hResInfo = FindResourceEx(hModule, lpType, lpName, wLang);
//将资源语言写入资源信息文件。
cbString = sprintf(szBuffer, "\t\tLanguage: %u\n",
(USHORT)wLang);
WriteFile(hFile,szBuffer,(DWORD)cbString,
&cbWritten, NULL);
//将资源句柄和大小写入缓冲区。
cbString = sprintf(szBuffer,
"\t\thResInfo == %lx, Size == %lu\n\n",
hResInfo,
SizeofResource(hModule, hResInfo));
WriteFile(hFile,szBuffer,(DWORD)cbString,
&cbWritten, NULL);
return TRUE;
}