Используйте OleLoadPicture для загрузки растрового ресурса с ошибкой 0x800a01e1 (CTL_E_INVALIDPICTURE)

#winapi #gdi

#winapi #gdi

Вопрос:

У меня есть класс в проекте, который загружает файл .bmp из файла и использует OleLoadPicture, который отлично работает, уже есть интерфейс для загрузки с ресурса, но когда я пытаюсь его использовать, я получаю ошибку CTL_E_INVALIDPICTURE . Две разные процедуры приведены ниже, почему не работает версия ресурса? Ресурс можно использовать в статическом элементе управления диалогового окна просто отлично, но в этом случае я хочу загрузить и нарисовать его, потому что его нужно изменить размер.

Вот эти процедуры, он находит ресурс с помощью RT_BITMAP, а идентификатор-IDB_MYBITMAP. Есть идеи, что не так?

Правка: Похоже OleLoadPicture , формат .bmp не поддерживает используемый формат. bmp, когда я поставил метку, чтобы убедиться, что он использовал копию, в итоге размер файла стал намного больше, а затем он работает. Так что, по-видимому, он не может загрузить кодированный RLE .bmp? Я предполагаю, что RLE, потому что, как уже упоминалось,. bmp отлично работает в редакторе ресурсов и имеет статический элемент управления, а размер невелик. Сохранение его другим способом увеличило его с 36 тыс. до 200 тыс.

 ////////////////// // Load from resource. Looks for "IMAGE" and "BITMAP" type. // BOOL CPicture::Load(HINSTANCE hinst, UINT nidres) {  // find resource in resource file  HRSRC hrsrc = ::FindResource(hinst, MAKEINTRESOURCE(nidres), _T("IMAGE"));   if (!hrsrc) {  hrsrc=::FindResource(hinst, MAKEINTRESOURCE(nidres), RT_BITMAP);  if (!hrsrc)  return FALSE;  }   // load resource into memory  DWORD len = ::SizeofResource(hinst, hrsrc);  if ( !len )   return FALSE;   HGLOBAL hresdata = ::LoadResource(hinst, hrsrc);  if ( !hresdata )  return FALSE;   HGLOBAL hglobal = ::GlobalAlloc(GMEM_MOVEABLE | GMEM_NODISCARD, len);  if ( !hglobal )  {  ::FreeResource(hresdata);  return FALSE;  }   char* pdest = reinterpret_castlt;char*gt; ( ::GlobalLock(hglobal) );  char* psrc = reinterpret_castlt;char*gt; ( ::LockResource(hresdata) );  if (!psrc || !pdest)  {  ::GlobalFree(hglobal);  ::FreeResource(hresdata);  return FALSE;  }   ::CopyMemory(pdest,psrc,len);  ::FreeResource(hresdata);  ::GlobalUnlock(hglobal);   // don't delete memory on object's release  IStream* pstream = NULL;  if ( ::CreateStreamOnHGlobal(hglobal,FALSE,amp;pstream) != S_OK )  {  ::GlobalFree(hglobal);  return FALSE;  }   // create memory file and load it  BOOL bret = Load(pstream);  pstream-gt;Release();   ::GlobalFree(hglobal);   return bret; }  ////////////////// // Load from path name. // BOOL CPicture::Load(LPCTSTR pszpathname) {  HANDLE hfile = ::CreateFile(pszpathname,   FILE_READ_DATA,  FILE_SHARE_READ,  NULL,   OPEN_EXISTING,  FILE_ATTRIBUTE_NORMAL,  NULL);  if ( hfile==INVALID_HANDLE_VALUE )  return FALSE;   DWORD high=0;  DWORD len = ::GetFileSize( hfile, amp;high);  if (len == 0 || high || len gt; MAX_GRAPHIC_FILESIZE)  return FALSE;   HGLOBAL hglobal = ::GlobalAlloc(GMEM_MOVEABLE | GMEM_NODISCARD, len);  if ( !hglobal ) {  ::CloseHandle(hfile);  return FALSE;  }   char* lpbuffer = reinterpret_castlt;char*gt; ( ::GlobalLock(hglobal) );   DWORD dwbytesread;  BOOL bret=ReadFile(hfile, lpbuffer, len, amp;dwbytesread, NULL) amp;amp; dwbytesread==len;   ::CloseHandle(hfile);  ::GlobalUnlock(hglobal);    if (bret) {  // don't delete memory on object's release  IStream* pstream = NULL;  if ( ::CreateStreamOnHGlobal(hglobal,FALSE,amp;pstream) != S_OK )  {  ::GlobalFree(hglobal);  return FALSE;  }   // create memory file and load it  bret = Load(pstream);  pstream-gt;Release();  }   ::GlobalFree(hglobal);   return bret; }  ////////////////// // Load from stream (IStream). This is the one that really does it: call // OleLoadPicture to do the work. // BOOL CPicture::Load(IStream* pstm) {  Free();   HRESULT hr = OleLoadPicture(pstm, 0, FALSE, IID_IPicture, (void**)amp;m_spIPicture);   return hr == S_OK; }  

Комментарии:

1. Какая программа использовалась для создания растрового файла? Очень немногие программы создают допустимые BMP-файлы. Можете ли вы предоставить минимальный растровый файл в виде шестнадцатеричного дампа или версию в кодировке base64 в вопросе?

2. Черт возьми, я не помню, но так как OleLoadPicture не мог обрабатывать bmp RLE, я просто изменил код, чтобы даже не использовать эти процедуры, и просто загрузил растровое изображение сам. Но этот вопрос может помочь кому-то совершить ту же ошибку по той же причине.