Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.04.2012, 22:02   #1
MaxxximyM
 
Регистрация: 15.04.2012
Сообщений: 3
По умолчанию WriteFile не работает.

Есть простенький код по записи картинки из ресурсов в файл на диске:

Код:
#include <windows.h>

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdParam, int nCmdShow)
{
    HRSRC hRes = 0;
    HGLOBAL hData = 0;
    LPVOID pData;
    hRes = FindResource(NULL, "IDB_BITMAP1", RT_BITMAP);
    DWORD dwSize = SizeofResource(NULL,hRes);
    hData = LoadResource(NULL, hRes);
    pData = LockResource(hData);
    HANDLE File = CreateFile("D:\\1.bmp",GENERIC_WRITE,FILE_SHARE_WRITE,0,OPEN_ALWAYS,0,0);
    DWORD Written=0;
    WriteFile(File,pData,dwSize,&Written,0);
    CloseHandle(File);
}
При сравнении сохранённого файла с исходным выяснилось что отличаются только первые строки, если открыть эти картинки в ASCII кодировке.
Что не так с этим кодом?

Последний раз редактировалось Stilet; 15.04.2012 в 22:50.
MaxxximyM вне форума Ответить с цитированием
Старый 16.04.2012, 01:46   #2
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

Шапочку написать надо.
Просто при чтении ресурса битмэпа игнорируется BITMAPFILEHEADER.
Его длина 14 байт и придется заполнять его самостоятельно.
Вот так:
Код:
	
	HRSRC hRes = FindResource(NULL, MAKEINTRESOURCE(IDB_BITMAP1), RT_BITMAP);
	DWORD dwSize = SizeofResource(NULL, hRes);
	HGLOBAL hData = LoadResource(NULL, hRes);
	LPVOID  pData = LockResource(hData);
	HANDLE File = CreateFile("D:\\1.bmp", GENERIC_WRITE, FILE_SHARE_WRITE, 0, OPEN_ALWAYS, 0, 0);
		
	PBITMAPINFOHEADER pbih = (PBITMAPINFOHEADER) pData;
	BITMAPFILEHEADER bmphead = {};
	bmphead.bfType = MAKEWORD('B','M'); 
	bmphead.bfSize = (DWORD) (sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + pbih->biClrUsed * sizeof(RGBQUAD) + dwSize); 
	bmphead.bfOffBits = (DWORD) sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + pbih->biClrUsed* sizeof(RGBQUAD); 

	DWORD Written =  0;
	WriteFile(File, &bmphead, sizeof(BITMAPFILEHEADER), &Written, 0);
	WriteFile(File, pData, dwSize, &Written, 0);
	CloseHandle(File);

Последний раз редактировалось EUGY; 16.04.2012 в 02:57.
EUGY вне форума Ответить с цитированием
Старый 16.04.2012, 14:58   #3
MaxxximyM
 
Регистрация: 15.04.2012
Сообщений: 3
По умолчанию

Спасибо огромное, всё заработало.
Как + в репутацию тебе кинуть?
З.Ы.: Первый раз на форуме.
MaxxximyM вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
WriteFile Madmaxisss Win Api 5 01.04.2012 14:08
WriteFile в циклах _PROGRAMM_ Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 3 11.02.2012 23:00
Проблемы с WriteFile Silly Student C++ Builder 0 07.12.2011 10:28
Альтернатива WriteFile Egor2005 Win Api 3 11.04.2007 20:11