Я пытаюсь загрузить изображение из неуправляемой библиотеки dll и не смог пройти мимо ошибки при преобразовании массива btye, полученного из dll, в растровое изображение.Загрузить файл растрового изображения из неуправляемой DLL в управляемом коде
Файл test.dll содержит следующую структуру, если смотреть в визуальной студии:
test.dll
Bitmap
+411
Иконка
+1002 [Английский (United States]
и когда Я дважды нажимаю ID 411 (узел Bimap). Я вижу файл BMP в редакторе растровых изображений , и когда я дважды щелкаю ID 1002 (узел значка), я могу видеть значки differnt в редакторе значков.
Таким образом, я уверен, что они являются действительными растровыми изображениями и значками, но когда я запускаю тест ниже, он не может преобразовать массив байтов в изображение, поскольку он ловит исключение, поскольку параметр недействителен. Ошибка Image.FromStream (... ".
Кто-нибудь знает, что это не так.
код ниже:
public partial class Form1 : Form
{
[DllImport("kernel32.dll", SetLastError = true)]
static extern IntPtr
LoadLibraryEx(string lpFileName, IntPtr hFile, int dwFlags);
[DllImport("kernel32.dll")]
static extern IntPtr FindResource(IntPtr hModule, int lpName, int 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 int DATAFILE = 2;
const int BITMAP_TYPE = 2;
const int ICON_TYPE = 3;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
}
private void button1_Click(object sender, EventArgs e)
{
IntPtr loadLib = LoadLibraryEx("tsjcore.dll", IntPtr.Zero, DATAFILE);
IntPtr findRes = FindResource(loadLib, 411, 2);
IntPtr loadRes = LoadResource(loadLib, findRes);
// Gives the correct size of image as
uint size = SizeofResource(loadLib, findRes);
byte[] imageArray = new byte[size];
// Loads the imageArray with data when viewed in debug mode.
Marshal.Copy(loadRes, imageArray, 0, (int)size);
Bitmap bitmap;
try
{
using (MemoryStream memoryStream = new MemoryStream(imageArray))
{
bitmap = (Bitmap)Bitmap.FromStream(memoryStream);
}
}
catch (Exception ex)
{
// displays parameter is not valid Image.FromStream(....
MessageBox.Show(ex.ToString());
}
}
}
+1 Похоже, в теге pinvoke мало трафика ..... –