Возникли проблемы с записью данных HGLOBAL DIB в файл

#c #winapi #gdi

#c #winapi #gdi

Вопрос:

Я использую библиотеку DLL карты захвата, которая экспортирует функцию, которая предоставляет дескриптор HGLOBAL, содержащий DIB. Я хочу записать этот DIB в файл. После того, как я заблокирую ресурс и получу указатель данных, я запрашиваю размер, и он составляет около 1 МБ. Но затем, когда я записываю их в файл, это всегда 0 байт. Это первый раз, когда я работаю с типом HGLOBAL, поэтому я предполагаю, что делаю что-то не так. Я ценю вашу помощь.

 char* dibData = (char*)LockResource(DIB);
if(NULL != dibData)
{
    SIZE_T dibSize = GlobalSize (DIB);
    f = fopen("thedib.dib", "wb");

    if (f)
    {
        n = fwrite(dibData,dibSize,1,f);
        fflush(f);
        fclose(f);
        wrote = true;
    }

    UnlockResource(DIB);
}
  

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

1. Каков результат SizeofResource(DIB) ? msdn.microsoft.com/en-us/library/windows/desktop/ms648048.aspx

2. Если я использую DWORD dibSize = SizeofResource (NULL,(HRSRC)DIB); тогда dibsize =0.

3. Мне интересно, нужен ли вообще LockResource, потому что это изображение не поступает из исполняемого файла.

4. Я думаю, естественный вопрос в том, как / откуда вы получили DIB?

Ответ №1:

Похоже, вы смешиваете API-интерфейсы ресурсов и API-интерфейсы глобальной памяти. Если это действительно ресурс, используйте LockResource(), SizeofResource(), UnlockResource() . Если это просто блок памяти, выделенный с помощью GlobalAlloc(), используйте GlobalLock(), GlobalSize(), GlobalUnlock() .

Кроме того, файл .bmp должен начинаться со BITMAPFILEHEADER структуры. Эта структура отсутствует для DIBS в памяти, поэтому вам необходимо записать эту структуру до записи ваших данных DIB.

http://msdn.microsoft.com/en-us/library/dd183374(v=vs.85).aspx

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

1. Если я это сделаю DWORD dibSize = SizeofResource (NULL,(HRSRC)DIB); , тогда dibsize = 0. Если я исправлю эту проблему, я обязательно напишу заголовок bitmap.

2. Установите точку останова сразу после LockResource (должна быть GlobalLock ?) и проверьте память, на которую указывает dibData . Если это допустимый DIB, первое DWORD будет равно 40 (0x28 hex), что соответствует размеру BITMAPINFOHEADER .

3. Я использовал GlobalLock, и это устранило проблему. Спасибо