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

C# 为什么loadimage可以在笔记本电脑上工作而不能在台式机上工作?,c#,windows,winapi,image-processing,bitmap,C#,Windows,Winapi,Image Processing,Bitmap,这段代码将图像加载到我的笔记本电脑(Windows10Ver1903)上,处理得很好。但是,它在我的桌面(Windows10Ver1809)上的句柄为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 cla

这段代码将图像加载到我的笔记本电脑(Windows10Ver1903)上,处理得很好。但是,它在我的桌面(Windows10Ver1809)上的句柄为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

    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());
编辑:仅供参考,如果我将图像保存在paint中,它将正常加载。loadimage仅加载特定位图(v4或v5?)时存在问题,因此我猜这可能与此相关

EDIT2:好吧,我找到答案了。自2019年12月或之前,我就没有在笔记本电脑上进行windows更新。更新后,我无法在笔记本电脑上使用loadimage()加载位图。看起来微软在他们的一次更新中改变了loadimage的工作方式。标题第15和第16字节处的0C 00表示我尝试加载的bmp是BITMAPCOREHEADER,它非常旧。Loadimage无法加载自顶向下的BMP。此外,c:\windows\system32\gdi32full.dll已更新为新版本。如有兴趣,请参阅以下链接:


您是否已使用SysInternals
Process Monitor
查看过这一点。这可能会为你指明正确的方向谢谢。我现在正在这么做。所有LoadImage行都成功地使用了图像库和图像大小。它可能不是权限。仍然不知道为什么它在一台机器上工作。请将
“C:\\Users\mm\Desktop\test.bmp”
更改为
“C:\\Users\\mm\\Desktop\\test.bmp”
,并确保
mm
用户在两台机器上都存在。获取用户实际桌面文件夹的更好解决方案是使用
Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory)
。很抱歉,我在最后一分钟将其放在帖子中以隐藏用户名。固定的。该目录确实存在。您在错误的位置查找问题。问题在于用于编写位图图像的工具。我要说的是,大多数应用程序都编写有缺陷的BMP文件。MS Paint对协议错误具有很强的弹性,可以写入正确的BMP文件。如果有疑问。在让软件尝试加载BMP文件之前,请始终在MS Paint中加载BMP文件并将其保存。您是否使用SysInternals
Process Monitor
查看过这一点。这可能会为你指明正确的方向谢谢。我现在正在这么做。所有LoadImage行都成功地使用了图像库和图像大小。它可能不是权限。仍然不知道为什么它在一台机器上工作。请将
“C:\\Users\mm\Desktop\test.bmp”
更改为
“C:\\Users\\mm\\Desktop\\test.bmp”
,并确保
mm
用户在两台机器上都存在。获取用户实际桌面文件夹的更好解决方案是使用
Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory)
。很抱歉,我在最后一分钟将其放在帖子中以隐藏用户名。固定的。该目录确实存在。您在错误的位置查找问题。问题在于用于编写位图图像的工具。我要说的是,大多数应用程序都编写有缺陷的BMP文件。MS Paint对协议错误具有很强的弹性,可以写入正确的BMP文件。如果有疑问。在软件尝试加载BMP文件之前,请始终在MS Paint中加载BMP文件并将其保存。