为什么loadimage可以在笔记本电脑上工作,但不能在台式机上工作?

时间:2020-04-27 16:22:54

标签: c# windows winapi image-processing bitmap

此代码将图像加载到具有良好手柄的笔记本电脑(WIndows 10 ver 1903)上。但是,它在我的桌面(Windows 10 ver 1809)上的句柄为0。两者的错误代码均为0。

我的组织中可能有一些权限更改,因此,我正在尝试确定是否由于权限而未加载该文件。

如果需要,我可以给你位图。是6MB。但是标题是:

42 4D C2 13 5F 00 00 00 00 00 1A 00 00 00 0C 00 00 00 F3 04 66 06 01 00 18 00 FF FF FF FF FF FF

    class Program
    {
        [DllImport("user32.dll", SetLastError = true)]
        static extern IntPtr LoadImage(IntPtr hinst, string lpszName, uint uType, int cxDesired, int cyDesired, uint fuLoad);
        static void Main(string[] args)
        {
            try
            {

                string f = "C:\\Users\\mm\\Desktop\\test.bmp";
                if (File.Exists(f))
                {
                    string newf = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), Path.GetFileName(f));
                    if (File.Exists(newf))
                    {
                        File.Delete(newf);
                    }
                    File.Copy(f, newf);
                    IntPtr s = LoadImage(IntPtr.Zero, newf, 0, 0, 0, 16 | 8192);
                    int er = Marshal.GetLastWin32Error();
                    Console.WriteLine(s.ToString() == "0" ? "Cannot Load File, Result: " + s.ToString() : "Loaded file, Result: " + s.ToString());

编辑:仅供参考,如果我将图像保存在油漆中,它将很好地加载。 loadimage仅加载特定的位图(v4或v5?)存在一个问题,所以我猜想这可能是相关的。

EDIT2:好的,我找到了答案。自2019年12月或更早以来,我尚未在笔记本电脑上进行Windows更新。更新后,我无法在笔记本电脑上使用loadimage()加载位图。看起来Microsoft更改了loadimage在其更新之一中的工作方式。标头的第15个和第16个字节的0C 00表示我要加载的bmp是BITMAPCOREHEADER,这确实很旧。 Loadimage无法加载自上而下的bmp。此外,c:\ windows \ system32 \ gdi32full.dll已更新为较新版本。如果有兴趣,请参见以下链接:

https://www.pentestpartners.com/security-blog/time-travel-debugging-finding-windows-gdi-flaws/

https://www.codeproject.com/script/Content/ViewAssociatedFile.aspx?rzp=%2FKB%2Fgraphics%2FJrsCExBitmap%2FExBmpDemo_src.zip&zep=CDibData%2FCDibData.cpp&obid=5934&obtid=2&ovid=1

0 个答案:

没有答案