Code::Blocks 中缺少资源名称,因此 FindResource 不起作用

Missing resource name in Code::Blocks and therefore FindResource doesn't work

我在 Code::Blocks 有一个项目。 在我的 resource.rc 文件中我有

#ifndef IDC_STATIC
#define IDC_STATIC (-1)
#endif

#define TWEETY                                  102

在我的 resource.h 文件中

#include <windows.h>
#include <commctrl.h>
#include <richedit.h>
#include "resource.h"

TWEETY IMAGE "Tweety.png"

我构建项目,然后在 ResEdit 中打开 exe 文件。 这就是我在那里看到的。 ResEdit

没有资源名称,只有资源 ID。 这导致(至少这是我的结论)我无法使用 FindResource 函数找到图像资源。

// Loads the PNG containing the splash image into a HBITMAP.
HBITMAP LoadSplashImage()
{
    HBITMAP hbmpSplash = NULL;

    // load the PNG image data into a stream
    IStream * ipImageStream = CreateStreamOnResource(MAKEINTRESOURCE(TWEETY), _T("PNG"));
    if (ipImageStream == NULL)
        goto Return;

    // load the bitmap with WIC
    IWICBitmapSource * ipBitmap = LoadBitmapFromStream(ipImageStream);
    if (ipBitmap == NULL)
        goto ReleaseStream;

    // create a HBITMAP containing the image
    hbmpSplash = CreateHBITMAP(ipBitmap);
    ipBitmap->Release();

    ReleaseStream:
       ipImageStream->Release();
    Return:
       return hbmpSplash;
}

// Creates a stream object initialized with the data from an executable resource.
IStream * CreateStreamOnResource(LPCTSTR lpName, LPCTSTR lpType)
{
    // initialize return value
    IStream * ipStream = NULL;

    // find the resource
    HRSRC hrsrc = FindResource(NULL, lpName, lpType);

    if (hrsrc == NULL)
        goto Return;

    // load the resource
    DWORD dwResourceSize = SizeofResource(NULL, hrsrc);
    HGLOBAL hglbImage = LoadResource(NULL, hrsrc);
    if (hglbImage == NULL)
        goto Return;

    // lock the resource, getting a pointer to its data
    LPVOID pvSourceResourceData = LockResource(hglbImage);
    if (pvSourceResourceData == NULL)
        goto Return;

    // allocate memory to hold the resource data
    HGLOBAL hgblResourceData = GlobalAlloc(GMEM_MOVEABLE, dwResourceSize);
    if (hgblResourceData == NULL)
        goto Return;

    // get a pointer to the allocated memory
    LPVOID pvResourceData = GlobalLock(hgblResourceData);
    if (pvResourceData == NULL)
        goto FreeData;

    // copy the data from the resource to the new memory block
    CopyMemory(pvResourceData, pvSourceResourceData, dwResourceSize);
    GlobalUnlock(hgblResourceData);

    // create a stream on the HGLOBAL containing the data
    if (SUCCEEDED(CreateStreamOnHGlobal(hgblResourceData, TRUE, &ipStream)))
        goto Return;

    FreeData:
    // couldn't create stream; free the memory

    GlobalFree(hgblResourceData);

    Return:

    return ipStream;
}

请指教我做错了什么。

更新 - 现在可以使用了。

TWEETY IMAGE "Tweety.png"

IStream * ipImageStream = CreateStreamOnResource(MAKEINTRESOURCE(TWEETY), _T("IMAGE"));

HRSRC hrsrc = FindResource(NULL, lpName, lpType);

但是,在 ResEdit 中我仍然看不到资源名称,只有资源 ID。

还有这个: MAKEINTRESOURCE(TWEETY);

returns“错误 - 无法访问地址 0x66 处的内存”。

资源类型由 ID 或名称标识。您的资源脚本定义了名称为 IMAGE 的资源类型(这就是您在 ResEdit 中看到 "IMAGE" 的原因;请注意引号)。

您正在将名称为 PNG 的资源类型传递给对 FindResource 的调用。该模块没有名为 PNG 的资源类型。它包含一个名为 IMAGE 的资源类型。当您通过 _T("IMAGE") 您的代码开始工作。