繁体   English   中英

如何从DLL中提取字符串资源

[英]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提取字符串(我不确定)。

可以使用LoadStringLoadIcon等提取资源。但是, 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM