【问题标题】:C++ Error when changing the cursor from a resource file从资源文件更改光标时出现 C++ 错误
【发布时间】:2018-06-13 20:07:09
【问题描述】:

我正在尝试使用资源文件中的 .cur 文件更改鼠标光标。

当我尝试我的代码时,我收到了这个错误:

在 CleanResourceFiles.exe 中的 0x77EB7392 (ntdll.dll) 处引发异常:0xC0000005:读取位置 0x00000066 时发生访问冲突。

代码如下:

HCURSOR curs = (HCURSOR)LoadImage(NULL, MAKEINTRESOURCE(IDC_CURSOR1), 2, 0, 0, LR_LOADFROMFILE);
SetSystemCursor(curs, 32512);

注意:IDC_CURSOR1 是我的光标,32512 是经典箭头光标的 ID。我还包括了<Windows.h> 和我的resource.h

我正在使用带有 Win10 的 Visual Studio Community 2017。

我尝试了其他功能,例如LoadCursor()。以上代码来自“VineMemz”。

最后,当我尝试使用我的.cur 文件的路径将光标更改为LoadFromFile() 时,它可以工作。

【问题讨论】:

    标签: c++ cursor loadimage ntdll resource-file


    【解决方案1】:

    当调用LoadImage() 时,您指定了LR_LOADFROMFILE 标志,因此lpszName 参数将被解释为指向以空结尾的字符串的指针,该字符串包含要加载的.cur 文件的路径。但是,您传入的是资源 ID 号而不是文件路径字符串(我假设 IDC_CURSOR1 是 102 (0x66),这与错误消息中报告的内存地址一致)。从资源加载图像时,您需要去掉 LR_LOADFROMFILE 标志。

    另外,您需要在hinst 参数中传入EXE 的实际模块句柄,而不是NULL(NULL 只能用于加载OEM 定义的图像)。

    还有。你不应该使用"magic numbers"LoadImage() 上的 2 应替换为 IMAGE_CURSOR 常量,SetSystemCursor() 上的 32512 应替换为 OCR_NORMAL 常量。

    试试这个:

    HCURSOR curs = (HCURSOR) LoadImage(GetModuleHandle(), MAKEINTRESOURCE(IDC_CURSOR1), IMAGE_CURSOR, 0, 0, 0);
    SetSystemCursor(curs, OCR_NORMAL);
    

    【讨论】:

    • 非常感谢!它正在工作! (对不起,如果对你来说这很明显,但我可能 4 天前开始学习 c++ 只是为了好玩,所以你!)
    猜你喜欢
    • 2021-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-21
    • 1970-01-01
    • 2014-07-24
    • 2010-09-30
    相关资源
    最近更新 更多