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")
您的代码开始工作。
我在 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")
您的代码开始工作。