从托管代码中的非托管DLL加载位图文件

本文关键字:DLL 加载 位图 文件 托管代码 | 更新日期: 2023-09-27 18:24:13

我正试图从非托管资源dll加载图像,但在将从dll检索到的btye数组转换为位图图像时,未能通过错误。

在visual studio中查看时,test.dll文件包含以下结构:
test.dll
位图
+411
图标
+1002[英语(美国)

当我双击ID411(Bimap节点)时,我可以在位图编辑器中看到bmp文件当我双击ID 1002(图标节点)时,我可以在图标编辑器中看到不同的图标。

因此,我确信它们是有效的位图和图标,但当我运行下面的测试时,它无法将字节数组转换为图像,因为它捕捉到"parameter is not valid 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());
        }
    }
}

从托管代码中的非托管DLL加载位图文件

您得到了一个指向BITMAPINFOHEADER的指针,文件头丢失了。因此Image.FromStream()无法工作。Pinvoke LoadBitmap()并使用Image.FromHbitmap().