LockResource (kernel32)
Last changed: -87.61.63.34

.
Summary

C# Signature:

[DllImport("kernel32.dll")]
static extern IntPtr LockResource(IntPtr hResData);

VB.NET Signature:

<DllImport("kernel32.dll")> _
Private Shared Function LockResource(hResData As IntPtr) As IntPtr
End Function

User-Defined Types:

None.

Notes:

does not call SetLastError, according to MSDN.

Tips & Tricks:

this function returnes a pointer to the resource. you can use Marshal.Copy() to copy the data from the pointer to a managed array.

Sample Code:

      pResource = LockResource(hResource);
      if (hResource.ToInt32() == 0) {
    throw new ApplicationException("could not get pointer to file");
      }
      fileSizeComp = ((Module)mFiles[index]).CompSize;
      fileSizeUnComp = ((Module)mFiles[index]).Size;
      byte[] fileBuffComp = new byte[fileSizeComp + mOffset];//original buffer
      byte[] fileBuffUnComp = new byte[fileSizeUnComp + 1]; //uncompressed file
      //copy to managed memory:
      Marshal.Copy(pResource, fileBuffComp, 0, fileSizeComp + mOffset);

Sample Code:

    [DllImport("Kernel32.dll", EntryPoint = "FindResourceW", SetLastError = true, CharSet = CharSet.Unicode)]
    private static extern IntPtr FindResource(IntPtr hModule, string pName, string pType);

    [DllImport("Kernel32.dll", EntryPoint = "SizeofResource", SetLastError = true)]
    private static extern uint SizeofResource(IntPtr hModule, IntPtr hResource);

    [DllImport("Kernel32.dll", EntryPoint = "LoadResource", SetLastError = true)]
    private static extern IntPtr LoadResource(IntPtr hModule, IntPtr hResource);

    [DllImport("Kernel32.dll", EntryPoint = "LockResource")]
    private static extern IntPtr LockResource(IntPtr hGlobal);

    internal static int TestFindResource()
    {

    IntPtr resH1 = FindResource(IntPtr.Zero, "RES_CUSTOMIZE", "CUSTOM");

    if (IntPtr.Zero == resH1)
    {
        throw new System.ComponentModel.Win32Exception();
    }

    IntPtr resH2 = LoadResource(IntPtr.Zero, resH1);

    if (IntPtr.Zero == resH2)
    {
        throw new System.ComponentModel.Win32Exception();
    }

    IntPtr resH3 = LockResource(resH2);

    if (IntPtr.Zero == resH3)
    {
        throw new Exception("Lock failed");
    }

    uint resSize = SizeofResource(IntPtr.Zero, resH1);

    byte[] y = new byte[resSize];

    Marshal.Copy(resH3, y, 0, (int)resSize);

    }

Alternative Managed API:

Do you know one? Please contribute it!

Documentation