Delphi XE6:如何枚举RCData资源名称?
Delphi XE6: How to enumerate RCData resource names?
我在可执行文件中嵌入了几个资源,例如语言(文本)文件。
下面你可以看到Languages.rc
文件的内容:
Language_English RCDATA Languages\English.ini
Language_German RCDATA Languages\German.ini
Language_Czech RCDATA Languages\Czech.ini
我找到了 this answer,这绝对有帮助,但我很难实现它。
假设您想要获取这些资源的列表作为以 EOL 分隔的字符串,那么第一步将是定义 EnumRCDataProc
函数:
function EnumRCDataProc(hModule: HMODULE; lpszType, lpszName: PChar; lParam: NativeInt): BOOL; stdcall;
begin
TStrings(lParam).Add(lpszName);
Result := True;
end;
完成后,我们就可以开始工作了:
function EnumerateRCDataResourceNames: string;
var
ExecutableHandle: HMODULE;
ResourcesList: TStringList;
begin
ExecutableHandle := LoadLibraryEx(PChar(Application.ExeName), 0, LOAD_LIBRARY_AS_DATAFILE);
try
ResourcesList := TStringList.Create;
try
EnumResourceNames(ExecutableHandle, RT_RCDATA, @EnumRCDataProc, NativeInt(ResourcesList));
Result := ResourcesList.Text;
finally
ResourcesList.Free;
end;
finally
FreeLibrary(ExecutableHandle);
end;
end;
备注:
如原始答案(参见问题)一样,无法使用 LOAD_LIBRARY_AS_DATAFILE_EXCLUSIVE
或 LOAD_LIBRARY_AS_IMAGE_RESOURCE
,因为这些类型不再在 [=44= 中定义] XE6,至少AFAIK.
但是,您可以根据 MSDN:
定义这些常量
LOAD_LIBRARY_AS_DATAFILE_EXCLUSIVE
= [=16=]000040
LOAD_LIBRARY_AS_IMAGE_RESOURCE
= [=18=]000020
我在可执行文件中嵌入了几个资源,例如语言(文本)文件。
下面你可以看到Languages.rc
文件的内容:
Language_English RCDATA Languages\English.ini
Language_German RCDATA Languages\German.ini
Language_Czech RCDATA Languages\Czech.ini
我找到了 this answer,这绝对有帮助,但我很难实现它。
假设您想要获取这些资源的列表作为以 EOL 分隔的字符串,那么第一步将是定义 EnumRCDataProc
函数:
function EnumRCDataProc(hModule: HMODULE; lpszType, lpszName: PChar; lParam: NativeInt): BOOL; stdcall;
begin
TStrings(lParam).Add(lpszName);
Result := True;
end;
完成后,我们就可以开始工作了:
function EnumerateRCDataResourceNames: string;
var
ExecutableHandle: HMODULE;
ResourcesList: TStringList;
begin
ExecutableHandle := LoadLibraryEx(PChar(Application.ExeName), 0, LOAD_LIBRARY_AS_DATAFILE);
try
ResourcesList := TStringList.Create;
try
EnumResourceNames(ExecutableHandle, RT_RCDATA, @EnumRCDataProc, NativeInt(ResourcesList));
Result := ResourcesList.Text;
finally
ResourcesList.Free;
end;
finally
FreeLibrary(ExecutableHandle);
end;
end;
备注:
如原始答案(参见问题)一样,无法使用
LOAD_LIBRARY_AS_DATAFILE_EXCLUSIVE
或LOAD_LIBRARY_AS_IMAGE_RESOURCE
,因为这些类型不再在 [=44= 中定义] XE6,至少AFAIK.但是,您可以根据 MSDN:
定义这些常量LOAD_LIBRARY_AS_DATAFILE_EXCLUSIVE
=[=16=]000040
LOAD_LIBRARY_AS_IMAGE_RESOURCE
=[=18=]000020