C# 为什么loadimage可以在笔记本电脑上工作而不能在台式机上工作?
这段代码将图像加载到我的笔记本电脑(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 FFC# 为什么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
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文件并将其保存。您是否使用SysInternalsProcess 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文件并将其保存。