#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.aspx2. Если я использую 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, и это устранило проблему. Спасибо