[英]How to extract string resource from DLL
我正在制作一个用于管理系统文件扩展名的应用程序,我有问题。
诸如.jpg
, .exe
, .dll
, .png
, .txt
等系统扩展名的注册表值名为FriendlyTypeName
,例如,jpeg文件的FriendlyTypeName
为@%SystemRoot%\\System32\\shell32.dll,-30596
。 显示的值取决于当前语言。
如何使用C#从资源ID(例如-30596
)中提取字符串值? 我猜可以使用p / invoke提取字符串(我不确定)。
可以使用LoadString
, LoadIcon
等提取资源。但是, hInstance
必须不同于应用程序的hInstance
,否则,您将只能从自己的.exe
提取资源。 如果要从系统库之类的外部DLL中提取任何资源,则必须通过调用LoadLibrary
获取要提取的DLL的hInstance
,然后调用FreeLibrary
以完成文件使用。
[DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Ansi)]
private static extern IntPtr LoadLibrary([MarshalAs(UnmanagedType.LPStr)]string lpFileName);
[DllImport("user32.dll", CharSet = CharSet.Auto)]
private static extern int LoadString(IntPtr hInstance, int ID, StringBuilder lpBuffer, int nBufferMax);
[DllImport("kernel32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool FreeLibrary(IntPtr hModule);
private string ExtractStringFromDLL(string file, int number) {
IntPtr lib = LoadLibrary(file);
StringBuilder result = new StringBuilder(2048);
LoadString(lib, number, result, result.Capacity);
FreeLibrary(lib);
return result.ToString();
}
StringBuilder
最大容量为2048
(如果您愿意,可以更改该值)。
这是一个例子:
string loadedString = ExtractStringFromDLL("shell32.dll", 30596);
Debug.Write(loadedString);
Windows的默认相对路径为%SystemRoot%\\system32
,除非您要从非系统DLL中提取字符串,否则不需要包括完整路径。
不要忘记从资源号中删除-
符号,因为负数表示FriendlyTypeName
资源ID,而LoadString
需要正数作为资源ID。
编辑 :您还可以从.exe
文件和任何包含资源的文件中提取资源。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.