-532462766 == 0xe0434352. Последние три шестнадцатеричных пары означают «CCR», распространенную уловку, которую программисты Microsoft используют, чтобы попытаться придумать легко узнаваемый код исключения. Точное значение весьма загадочно, за исключением того, что оно обычно ассоциируется с управляемым кодом и, по-видимому, является очень низким уровнем в подсистеме, которая обычно не дает значимого управляемого исключения.
Для этого загадочного исключения есть отличная причина - ваше объявление EnumResources неверно. Второй аргумент - IntPtr, а не int. Это имеет некоторые шансы стать kaboom в 64-битной операционной системе.
Пожалуйста, напишите обратно, если вы когда-нибудь выясните, что означает CCR.
using System;
using System.ComponentModel;
using System.Runtime.InteropServices;
using System.Diagnostics;
class Program {
static void Main(string[] args) {
try {
IntPtr module = LoadLibraryEx(@"C:\windows\system32\user32.dll", IntPtr.Zero, 2);
if (module == IntPtr.Zero) throw new Win32Exception();
if (!EnumResourceNames(module, (IntPtr)3, new EnumResNameProc(ListCallback), IntPtr.Zero))
throw new Win32Exception();
}
catch (Win32Exception ex) {
Console.WriteLine(ex.Message);
}
Console.ReadLine();
}
static bool ListCallback(IntPtr hModule, IntPtr type, IntPtr name, IntPtr lp) {
long idorname = (long)name;
if (idorname >> 16 == 0) Console.WriteLine("#{0}", idorname);
else Console.WriteLine(Marshal.PtrToStringAnsi(name));
return true;
}
public delegate bool EnumResNameProc(IntPtr hModule, IntPtr type, IntPtr name, IntPtr lp);
[DllImport("kernel32.dll", SetLastError = true)]
public extern static bool EnumResourceNames(IntPtr hModule, IntPtr type, EnumResNameProc lpEnumFunc, IntPtr lParam);
[DllImport("kernel32.dll", SetLastError = true)]
public extern static IntPtr LoadLibraryEx(string lpFileName, IntPtr hFile, int dwFlags);
}