Win32 Loadimage генерирует ошибки 1812 и 1813

Я столкнулся с этой проблемой при написании игры тральщика. Я использовал растровое изображение для чисел, мин и пробелов. Я думаю, что я правильно зарегистрировал их в файле ресурсов

IDI_0                   BITMAP                  "D:\\User\\Mark\\Documents\\C++\\win32\\MineSweeper\\MineSweeper\\empty.bmp"IDI_1                   BITMAP                  "D:\\User\\Mark\\Documents\\C++\\win32\\MineSweeper\\MineSweeper\\1.bmp"IDI_2                   BITMAP                  "D:\\User\\Mark\\Documents\\C++\\win32\\MineSweeper\\MineSweeper\\2.bmp"IDI_3                   BITMAP                  "D:\\User\\Mark\\Documents\\C++\\win32\\MineSweeper\\MineSweeper\\3.bmp"

и заголовочный файл

#define IDI_0                           200
#define IDI_1                           201
#define IDI_2                           202
#define IDI_3                           203

и я загружаю их вот так

h0 = (HBITMAP)LoadImage(hInst, MAKEINTRESOURCE(IDI_0), IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION);
h1 = (HBITMAP)LoadImage(hInst, MAKEINTRESOURCE(IDI_1), IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION);
h2 = (HBITMAP)LoadImage(hInst, MAKEINTRESOURCE(IDI_2), IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION);
h3 = (HBITMAP)LoadImage(hInst, MAKEINTRESOURCE(IDI_3), IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION);

Я также проверил exe-файл с помощью resourcehacker и нашел там все растровые изображения.

То, что я не понимаю, это то, что только иногда (~ 50%), когда я запускаю игру, всплывает либо

Error 1812: The specified image file did not contain a resource section.

или же

Error 1813: The specified resource type cannot be found.

Но если я загружу их из файлов, как это

h0 = (HBITMAP)LoadImage(NULL, L"D:\\User\\Mark\\Documents\\C++\\win32\\MineSweeper\\MineSweeper\\empty.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION);
h1 = (HBITMAP)LoadImage(NULL, L"D:\\User\\Mark\\Documents\\C++\\win32\\MineSweeper\\MineSweeper\\1.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION);
h2 = (HBITMAP)LoadImage(NULL, L"D:\\User\\Mark\\Documents\\C++\\win32\\MineSweeper\\MineSweeper\\2.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION);
h3 = (HBITMAP)LoadImage(NULL, L"D:\\User\\Mark\\Documents\\C++\\win32\\MineSweeper\\MineSweeper\\3.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION);

все отлично работает

Любые мысли или советы будут оценены. Спасибо!

2

Решение

Я бы лично подумал об использовании GDI + для загрузки ваших изображений. Вы все еще можете загрузить файл с диска или из раздела ресурсов вашего приложения. Это также дает вам преимущество доступа ко всем форматам изображений, которые изначально поддерживает Windows (BMP, GIF, JPEG, PNG, TIFF, Exif, WMF и EMF).

Чтобы использовать его, вам просто нужно сначала инициализировать GDI +, а затем выполнить выключение перед выходом из программы.

Вот функция, которую я использую для загрузки с диска-файла:

// BMP, GIF, JPEG, PNG, TIFF, Exif, WMF, and EMF
HBITMAP mLoadImageFile(wchar_t *filename)
{
HBITMAP result = NULL;
Bitmap bitmap(filename, false);
bitmap.GetHBITMAP(0, &result);
return result;
}

Если у нас есть файл ресурсов, который содержит следующее:

IDR_PNG1           RT_PNG            ".\\girl.png"IDR_JPG1           RT_JPG            ".\\rssLogo.jpg"

Тогда мы можем загрузить каждое из изображений таким образом:

HBITMAP png = loadImgResource(IDR_PNG1, L"RT_PNG");
HBITMAP jpg = loadImgResource(IDR_JPG1, L"RT_JPG");

Также две функции, которые я использую для загрузки из ресурса. Вы заметите, что я жестко запрограммирован в GetModuleHandle (0) во 2-й функции — измените это, если вы хотите читать из любого модуля (dll, exe), кроме текущего.

// BMP, GIF, JPEG, PNG, TIFF, Exif, WMF, and EMF
HBITMAP loadImgResource(wchar_t *pName, wchar_t *pType, HMODULE hInst)
{
Gdiplus::Bitmap *m_pBitmap;
HBITMAP result=NULL;

HRSRC hResource = FindResource(hInst, pName, pType);
if (!hResource)
return NULL;

DWORD imgSize = SizeofResource(hInst, hResource);
if (!imgSize)
return NULL;

const void *pResourceData = LockResource(LoadResource(hInst, hResource));
if (!pResourceData)
return NULL;

HANDLE m_hBuffer = GlobalAlloc(GMEM_MOVEABLE, imgSize);
if (m_hBuffer)
{
void* pBuffer = GlobalLock(m_hBuffer);
if (pBuffer)
{
CopyMemory(pBuffer, pResourceData, imgSize);
IStream* pStream = NULL;
if (CreateStreamOnHGlobal(m_hBuffer, FALSE, &pStream) == S_OK)
{
m_pBitmap = Gdiplus::Bitmap::FromStream(pStream);
pStream->Release();
if (m_pBitmap)
{
if (m_pBitmap->GetLastStatus() == Gdiplus::Ok)
{
m_pBitmap->GetHBITMAP(0, &result);
delete m_pBitmap;
}
}
}
GlobalUnlock(m_hBuffer);
}
GlobalFree(m_hBuffer);
}
return result;
}

HBITMAP loadImgResource(WORD resNum, LPWSTR pType)
{
return loadImgResource(MAKEINTRESOURCE(resNum), pType, GetModuleHandle(0));//hInst);
}
0

Другие решения


По вопросам рекламы [email protected]