Я много искал, но не мог найти, как загрузить ресурс, идентификатор которого является строкой.Учебник Здесь хорош, но не делает этого.Кто-нибудь знает, как это сделать?Вот моя структура.Я хочу загрузить PNG.
И код:
[DllImport("kernel32.dll", SetLastError = true)]
static extern IntPtr LoadLibraryEx(string lpFileName, IntPtr hFile, uint dwFlags);
[DllImport("kernel32.dll", SetLastError = true)]
static extern IntPtr FindResource(IntPtr hModule, string lpName, string lpType);
[DllImport("kernel32.dll")]
static extern IntPtr FindResource(IntPtr hModule, int lpID, string lpType);
[DllImport("kernel32.dll", SetLastError = true)]
static extern IntPtr LoadResource(IntPtr hModule, IntPtr hResInfo);
[DllImport("kernel32.dll", SetLastError = true)]
static extern uint SizeofResource(IntPtr hModule, IntPtr hResInfo);
const uint LOAD_LIBRARY_AS_DATAFILE = 0x00000002;
void LoadSkin() {
IntPtr hMod = LoadLibraryEx(@"C:\Users\myuser\Desktop\skin.dll", IntPtr.Zero, LOAD_LIBRARY_AS_DATAFILE);
IntPtr hRes = FindResource(hMod, "BACK.PNG", "23");
MessageBox.Show(hRes.ToString()); // <- 0 here.
uint size = SizeofResource(hMod, hRes);
IntPtr pt = LoadResource(hMod, hRes);
Bitmap bmp;
byte[] bPtr = new byte[size];
Marshal.Copy(pt, bPtr, 0, (int) size);
using (MemoryStream m = new MemoryStream(bPtr))
bmp = (Bitmap) Bitmap.FromStream(m);
}
РЕДАКТИРОВАТЬ:
ИсправленоЭто.Проблема была в объявлении FindResource.Для моего случая правильным было:
[DllImport("kernel32.dll", SetLastError = true)]
static extern IntPtr FindResource(IntPtr hModule, string lpName, uint lpType);