EnumResourceNames (kernel32)
Last changed: -79.214.24.91

.
Summary

C# Signature:

[DllImport("kernel32.dll")]
static extern bool EnumResourceNames(IntPtr hModule, string lpszType,
   ResNameDelegate lpEnumFunc, IntPtr lParam);

    enum ResType
    {
        RT_CURSOR = 1,
        RT_BITMAP = 2,
        RT_ICON = 3,
        RT_MENU = 4,
        RT_DIALOG = 5,
        RT_STRING = 6,
        RT_FONTDIR = 7,
        RT_FONT = 8,
        RT_ACCELERATOR = 9,
        RT_RCDATA = 10,
        RT_MESSAGETABLE = 11,
        RT_GROUP_CURSOR = 12,
        RT_GROUP_ICON = 14,
        RT_VERSION = 16,
        RT_DLGINCLUDE = 17,
        RT_PLUGPLAY = 19,
        RT_VXD = 20,
        RT_ANICURSOR = 21,
        RT_ANIICON = 22,
        RT_HTML = 23,
        RT_MANIFEST = 24
    }

VB Signature:

<DllImport("kernel32.dll", CharSet:=CharSet.Unicode, EntryPoint:="EnumResourceNamesW", SetLastError:=True)> _
Private Shared Function EnumResourceNames(ByVal hModule As IntPtr, ByVal lpszType As String, ByVal lpEnumFunc As EnumResNameProcDelegate, ByVal lParam As IntPtr) As Boolean
    End Function

<DllImport("kernel32.dll", CharSet:=CharSet.Unicode, EntryPoint:="EnumResourceNamesW", SetLastError:=True)> _
Private Shared Function EnumResourceNames(ByVal hModule As IntPtr, ByVal lpszType As Integer, ByVal lpEnumFunc As EnumResNameProcDelegate, ByVal lParam As IntPtr) As Integer
    End Function

User-Defined Types:

None.

Notes:

None.

Tips & Tricks:

Please add some!

VB Sample Code:

Class Test
     Private Delegate Function EnumResNameProcDelegate(ByVal hModule As IntPtr, ByVal lpszType As IntPtr, ByVal lpszName As IntPtr, ByVal lParam As IntPtr) As Boolean

     <DllImport("kernel32.dll", CharSet:=CharSet.Unicode, EntryPoint:="EnumResourceNamesW", SetLastError:=True)> _
     Private Shared Function EnumResourceNames(ByVal hModule As IntPtr, ByVal lpszType As String, ByVal lpEnumFunc As EnumResNameProcDelegate, ByVal lParam As IntPtr) As Boolean
     End Function

     <DllImport("kernel32.dll", CharSet:=CharSet.Unicode, EntryPoint:="EnumResourceNamesW", SetLastError:=True)> _
     Private Shared Function EnumResourceNames(ByVal hModule As IntPtr, ByVal lpszType As Integer, ByVal lpEnumFunc As EnumResNameProcDelegate, ByVal lParam As IntPtr) As Integer
     End Function

     Private Sub ShowResources()
      Dim dll_hInst As IntPtr

      On Error Resume Next

      dll_hInst = LoadLibraryEx(Filename.Text, 0, 1)

      If Not dll_hInst.Equals(IntPtr.Zero) Then
          EnumResourceNames(dll_hInst, "AVI", AddressOf EnumResNameProc, IntPtr.Zero)
          FreeLibrary(dll_hInst)
      End If    
     End Sub

     Private Function EnumResNameProc(ByVal hModule As IntPtr, ByVal lpszType As IntPtr, ByVal lpszName As IntPtr, ByVal a As IntPtr) As Boolean
     Dim s As String

     On Error Resume Next

     If (lpszName.ToInt32 > Short.MaxValue) Then
         s = Marshal.PtrToStringUni(lpszName)
     Else
         s = lpszName.ToString()
     End If

     debug.WriteLine(s)

     EnumResNameProc = True
     End Function
End Class

Sample Code:

  using System;
  using System.Runtime.InteropServices;

  namespace EnumResNames_CS
  {
   class Class1
   {
    private const uint RT_CURSOR = 0x00000001;
    private const uint RT_BITMAP = 0x00000002;
    private const uint RT_ICON = 0x00000003;
    private const uint RT_MENU = 0x00000004;
    private const uint RT_DIALOG = 0x00000005;
    private const uint RT_STRING = 0x00000006;
    private const uint RT_FONTDIR = 0x00000007;
    private const uint RT_FONT = 0x00000008;
    private const uint RT_ACCELERATOR = 0x00000009;
    private const uint RT_RCDATA = 0x0000000a;
    private const uint RT_MESSAGETABLE = 0x0000000b;

    private const uint LOAD_LIBRARY_AS_DATAFILE = 0x00000002;

    [DllImport("kernel32.dll", SetLastError = true)]
    private static extern IntPtr LoadLibraryEx(string lpFileName, IntPtr hFile, uint dwFlags);

    [DllImport("kernel32.dll", SetLastError = true)]
    private static extern bool FreeLibrary(IntPtr hModule);

    [DllImport("kernel32.dll", EntryPoint = "EnumResourceNamesW", CharSet = CharSet.Unicode, SetLastError = true)]
    static extern bool EnumResourceNamesWithName(
      IntPtr hModule,
      string lpszType,
      EnumResNameDelegate lpEnumFunc,
      IntPtr lParam);

    [DllImport("kernel32.dll", EntryPoint = "EnumResourceNamesW", CharSet = CharSet.Unicode, SetLastError = true)]
    static extern bool EnumResourceNamesWithID(
      IntPtr hModule,
      uint lpszType,
      EnumResNameDelegate lpEnumFunc,
      IntPtr lParam);

    private delegate bool EnumResNameDelegate(
      IntPtr hModule,
      IntPtr lpszType,
      IntPtr lpszName,
      IntPtr lParam);

    private static bool IS_INTRESOURCE(IntPtr value)
    {
      if ( ((uint) value) > ushort.MaxValue)
    return false;
      return true;
    }
    private static uint GET_RESOURCE_ID(IntPtr value)
    {
      if (IS_INTRESOURCE(value) == true)
    return (uint) value;
      throw new System.NotSupportedException("value is not an ID!");
    }
    private static string GET_RESOURCE_NAME(IntPtr value)
    {
      if (IS_INTRESOURCE(value) == true)
    return value.ToString();
      return Marshal.PtrToStringUni((IntPtr) value);
    }

    [STAThread]
    static void Main(string[] args)
    {
      IntPtr hMod = LoadLibraryEx(@"D:\Test\StringResource\Debug\StringResource.exe", IntPtr.Zero, LOAD_LIBRARY_AS_DATAFILE);
      if (EnumResourceNamesWithID(hMod, RT_ICON, new EnumResNameDelegate(EnumRes), IntPtr.Zero) == false)
      {
    Console.WriteLine("gle: {0}", Marshal.GetLastWin32Error());
      }
      FreeLibrary(hMod);
    }

    static bool EnumRes(IntPtr hModule,
      IntPtr lpszType,
      IntPtr lpszName,
      IntPtr lParam)
    {
      Console.WriteLine("Type: {0}", GET_RESOURCE_NAME(lpszType));
      Console.WriteLine("Name: {0}", GET_RESOURCE_NAME(lpszName));
      return true;
    }
   }
  }

Alternative Managed API:

Do you know one? Please contribute it!

Documentation