0

我是 Win32 API 的新手。我正在尝试使用 win32 API。当我加载图像时,我得到了一个句柄,但我也得到了 GetLastError 响应 0x06,无效句柄。我究竟做错了什么?

class Program
{
    [DllImport("user32.dll", EntryPoint="LoadImage", SetLastError = true, CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
    static extern IntPtr LoadImage(IntPtr hinst, string lpszName, uint uType,
       int cxDesired, int cyDesired, uint fuLoad);

    [DllImport("kernel32.dll", EntryPoint ="GetLastError", CallingConvention = CallingConvention.StdCall)]
    public static extern uint GetLastError();

    static void Main(string[] args)
    {
        string path = @"c:\temp\bitmap.bmp";
        IntPtr pointer = LoadImage(IntPtr.Zero, path, 0, 256, 256, 0x00008010);
        uint result = GetLastError();
        Console.WriteLine(pointer);
        Console.WriteLine(result);
        Console.ReadLine();
    }
}

输出内容为:

-1576718263
6

我不确定我做错了什么。我想配置调用以从文件加载图像,并且还具有共享句柄,因为我将通过应用程序使用该句柄。

谢谢, Maciej

4

1 回答 1

2

您应该只GetLastError在函数失败时调用,如返回值所示。从MSDN 文档

如果函数成功,则返回值是新加载的图像的句柄。

如果函数失败,则返回值为 NULL。要获取扩展错误信息,请调用 GetLastError。

在函数成功时调用它是没有意义的。

使用以下方法会更好:

IntPtr pointer = LoadImage(IntPtr.Zero, path, 0, 256, 256, 0x00008010);
if (pointer == NULL) {
    uint result = GetLastError();
    Console.WriteLine(result);
    Console.ReadLine();
}

请记住,正如某些人在评论中指出的那样,您不应该GetLastError从托管代码中调用。相反,您应该设置SetLastErrortrue然后使用Marshal.GetLastWin32Error. 有关详细信息,请参见此处

于 2013-11-18T20:34:03.607 回答