Почему loadimage работает на ноутбуке, а не на настольном компьютере? - PullRequest
1 голос
/ 27 апреля 2020

Этот код загружает изображение на моем ноутбуке (WIndows 10 ver 1903) с хорошей ручкой. Но он дает дескриптор 0 на моем рабочем столе (windows 10 ver 1809). Оба дают код ошибки 0.

Возможно, в моей организации произошли некоторые изменения разрешений, поэтому я пытаюсь определить, не загружается ли это из-за разрешений.

Я могу дать Вы растровое изображение, если это необходимо. Это 6 МБ. Но заголовок:

42 4D C2 13 5F 00 00 00 00 00 1A 00 00 00 0 C 00 00 00 F3 04 66 06 01 00 18 00 FF 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, загружающим только заданное c растровое изображение (v4 или v5?), Поэтому я предполагаю, что это может быть связано.

EDIT2: Хорошо, я нашел ответ. Я не делал windows обновлений на своем ноутбуке с декабря 2019 года или раньше. После обновления я не могу загрузить растровое изображение с помощью loadimage () на своем ноутбуке. Похоже, Microsoft изменила способ работы loadimage в одном из своих обновлений. 0 C 00 в 15-м и 16-м байтах заголовка указывает, что bmp, который я пытаюсь загрузить, это BITMAPCOREHEADER, который действительно старый. Loadimage не может загрузить сверху вниз bmps. Также 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

...