Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Использование ресурса из DLL


Автор: Gram02 14.7.2006, 11:52
Тут у меня тьакая проблема у меня есть длл в ней хранятся все картинки мне надо отрисовать на форме картинку(она в JPEG), проект на билдере но мона юзать тока чистый апи для этого мне надо использовать Image из gdi+ но у него в конструкторе принимается либо имя файла либо стреам а у меня есть тока имя ресурса в длл  как это мона сделать? smile  smile  smile  smile 
 smile   

Автор: Romikgy 14.7.2006, 12:19
Цитата(Gram02 @  14.7.2006,  10:52 Найти цитируемый пост)
 чистый апи


Цитата(Gram02 @  14.7.2006,  10:52 Найти цитируемый пост)
 Image

это билдеровское?
если да то наверное можно юзать и ResourceStream, в него грузишь из ресурса, а из него на форму 

Автор: Gram02 14.7.2006, 12:32
нет я писал что это GDI+  незя юзать функции билдера еслиб мона было проблем бы небыло 
я тут полазил может это можно сделать через HGLOBAL я могу получить его для ресурса но как из него сделать поток т.е. IStream  или что то с ним совместимое 

 smile  

Автор: Romikgy 14.7.2006, 12:39
мне лично не понятно как ты рисуешь и как читаешь ресурс , исходник где? 

Автор: DeadSoul 14.7.2006, 13:06
Gram02, покажи исходник на тему "как я бы грузил картинку из ехе

Автор: Gram02 14.7.2006, 18:06
Проблема решена вот решение 

Код

HRSRC hResource = FindResource(GetModuleHandle("skins.dll"), "imsgbox_jpg",RT_RCDATA);
DWORD error;
    error = GetLastError();
    HGLOBAL hTemplate = LoadResource(GetModuleHandle("skins.dll"), hResource);
    IStream *str;
    CreateStreamOnHGlobal(hTemplate,true,&str);
    int status;
    Image = new Gdiplus::Image((IStream*)str);
 

Автор: Gram02 14.7.2006, 18:49
А вот более правильное решение 
Код

bool CGdiPlusBitmapResource::Load(LPCTSTR pName, LPCTSTR pType, 
                                  HMODULE hInst)
{
    Empty();

    HRSRC hResource = ::FindResource(hInst, pName, pType);
    if (!hResource)
        return false;
    
    DWORD imageSize = ::SizeofResource(hInst, hResource);
    if (!imageSize)
        return false;

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

    m_hBuffer  = ::GlobalAlloc(GMEM_MOVEABLE, imageSize);
    if (m_hBuffer)
    {
        void* pBuffer = ::GlobalLock(m_hBuffer);
        if (pBuffer)
        {
            CopyMemory(pBuffer, pResourceData, imageSize);

            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)
            return true;

          delete m_pBitmap;
          m_pBitmap = NULL;
        }
            }
            m_pBitmap = NULL;
            ::GlobalUnlock(m_hBuffer);
        }
        ::GlobalFree(m_hBuffer);
        m_hBuffer = NULL;
    }
    return false;
}
 
       

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)