我正在制作一个管理系统文件扩展名的应用程序,我遇到了问题。
系统扩展喜欢.jpg,.exe,.dll,.png,.txt,等有一个名为注册表值FriendlyTypeName,例如,FriendlyTypeName一个JPEG文件的是@%SystemRoot%\System32\shell32.dll,-30596。显示值取决于当前语言。
如何-30596使用 C#从资源 ID(例如:)中提取字符串值?。我想可以使用 p/invoke 提取字符串(我不确定)。
小智 7
资源可以是提取使用LoadString,LoadIcon和等。但是,hInstance必须是你的应用程序的不同hInstance,否则,你将只能从自己的提取资源.exe。如果要从系统库等外部 DLL 中提取任何资源,则必须hInstance通过调用获取要提取的 DLL 的LoadLibrary,然后调用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();
}
Run Code Online (Sandbox Code Playgroud)
StringBuilder最大容量是2048(如果您愿意,可以更改该值)。
下面是一个例子:
string loadedString = ExtractStringFromDLL("shell32.dll", 30596);
Debug.Write(loadedString);
Run Code Online (Sandbox Code Playgroud)
Windows 的默认相对路径是%SystemRoot%\system32并且不需要包含完整路径,除非您从非系统 DLL 中提取字符串。
不要忘记-从资源编号中删除符号,因为负数表示资源 IDFriendlyTypeName并且LoadString需要正数作为资源 ID。
编辑:您还可以从.exe文件和任何包含资源的文件中提取资源。