2012-02-13 2 views
1

Я пытаюсь загрузить изображение из неуправляемой библиотеки 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()); 
     } 
    } 
} 

ответ

2

Вы получаете указатель на BITMAPINFOHEADER, заголовок файла отсутствует. Поэтому Image.FromStream() не может работать. Pinvoke LoadBitmap() вместо этого и используйте Image.FromHbitmap().

+0

+1 Похоже, в теге pinvoke мало трафика ..... –

Смежные вопросы