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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 08.04.2011, 12:26   #1
Neolit1819
Пользователь
 
Регистрация: 28.03.2011
Сообщений: 51
По умолчанию winAPI и файлы

Добрый день. Помогите пожалуйста разобраться, пытаюсь перевести программу на winAPI
Код:
#include <stdlib.h>
#include <windows.h>
#include <tchar.h>

using namespace std;

class WorkToBMP {
public : 
	FILE *pFile; //файл для записи BMP
	BITMAPFILEHEADER bmfHeader; //заголовок файла
	BITMAPINFOHEADER bmiHeader; // структура файла

	void openfile(char* filepath)  
	{ pFile = fopen(filepath,"rb"); //открываем файл в режиме для чтения, в   двоичном  (непреобразующем) режиме. 
      if (pFile == NULL) {          
		 cout  <<" File  "<<filepath<< " not find"; exit (1);
	  }  
	}

	void closefile()
	{
		fclose(pFile);
	}

	void scanfile()
	{
		 // читаем заголовок файла
   if ( fread( &bmfHeader, 1, sizeof(bmfHeader), pFile ) != sizeof(bmfHeader) ) {
      fputs( "Eror header reads?",stderr ); 
      exit(2) ;
   }
   // читаем структура файла
   if ( fread( &bmiHeader, 1, sizeof(bmiHeader), pFile ) != sizeof(bmiHeader) ) {
      fputs( "Error read info header",stderr ) ; 
      exit (3);
   }

   printf( "Size = %d bytes\n", bmfHeader.bfSize ) ; // выводим размер
   printf( "Width = %d\n", bmiHeader.biWidth ) ;     //ширину 
   printf( "Height = %d\n", bmiHeader.biHeight ) ;   //и высоту изображения
	}
};


int _tmain(int argc, _TCHAR* argv[]) 
{
	WorkToBMP myBMP;

	myBMP.openfile("1.bmp"); 
	myBMP.scanfile();
	myBMP.closefile();


	return 0;
}
т.е. заменить все функции по работе с файлом на CreateFile,ReadFile и т.д.
вот, что получилось
Код:
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <tchar.h>

using namespace std;

class WorkToBMP {
public : 

	BITMAPFILEHEADER bmfHeader; //заголовок файла
	BITMAPINFOHEADER bmiHeader; // структура файла
	HANDLE FileHandle; //файл для записи BMP

	void openfile(const wchar_t* filepath)  
	{ 
	  FileHandle=CreateFile(filepath,GENERIC_READ |
      GENERIC_WRITE, FILE_SHARE_WRITE | FILE_SHARE_READ, NULL, OPEN_EXISTING,
      FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, 0);
	  if(INVALID_HANDLE_VALUE == FileHandle){
		  cout  <<" File  "<<filepath<< " not find"; exit (1);}
	}
    
	void closefile()
	{CloseHandle(FileHandle);}

	void scanfile()
	{
		 // читаем заголовок файла
   if (!(ReadFile(FileHandle,&bmfHeader,sizeof(bmfHeader),NULL,NULL) )) {
	   fputs( "Eror header reads",stderr ); 
       exit(2) ;
   }
         // читаем структура файла
    if (!(ReadFile(FileHandle,&bmiHeader,sizeof(&bmiHeader),NULL,NULL) )) {
	   fputs( "Error read info header",stderr ); 
       exit(2) ;
   }
 
  
   printf( "Size = %d bytes\n", bmfHeader.bfSize ) ; // выводим размер
   printf( "Width = %d\n", bmiHeader.biWidth ) ;     //ширину 
   printf( "Height = %d\n", bmiHeader.biHeight ) ;   //и высоту изображения
	}
};


int _tmain(int argc, CHAR* argv[]) 
{
	WorkToBMP myBMP;
 
	myBMP.openfile(L"C:\\1.bmp"); 
	myBMP.scanfile();
	myBMP.closefile();

	return 0;
}
Собственно программа запарывается на Exit(2),Exit(3), проверил, что я не протупил с условием выхода, поменяв их получил в виде вывода результата муссор. Стало быть ошибка где то в фунциях открытия/чтения. Заранее примного благодарен.
Neolit1819 вне форума Ответить с цитированием
Старый 08.04.2011, 12:41   #2
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

Цитата:
FILE_FLAG_OVERLAPPED
это зачем?

И после каждой неуспешной операции выводите GetLastError(), иначе можно долго гадать, что там где не так.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 08.04.2011, 13:38   #3
Neolit1819
Пользователь
 
Регистрация: 28.03.2011
Сообщений: 51
По умолчанию

Цитата:
Сообщение от veniside Посмотреть сообщение
это зачем?

И после каждой неуспешной операции выводите GetLastError(), иначе можно долго гадать, что там где не так.
Я только начал изучать winAPI и поэтому могу делать глупые ошибки Как понимаю FILE_FLAG_OVERLAPPED отвечает за доступ к файлу в асинхронном режиме, если его убрать то при запуске приложения оно сразу же вызывает исключение и завершается, чем его заменить?

На счет GetLastError() - добоавил, выводит ошибку 87 -- Invalid parameter (Неверно задан параметр). Хотя задаю параметры как по "учебнику"
Neolit1819 вне форума Ответить с цитированием
Старый 08.04.2011, 14:37   #4
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

> отвечает за доступ к файлу в асинхронном режиме

верно, но читаете вы синхронно, так что флаг этот просто не нужен.

> если его убрать то при запуске приложения оно сразу же вызывает исключение и завершается

в какой строке возникает исключение?

> Invalid parameter (Неверно задан параметр)

четвертый параметр у ReadFile() не может быть NULL при синхронном чтении, может из-за этого

Код:
sizeof(&bmiHeader)
& тут лишний
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 08.04.2011, 14:53   #5
Neolit1819
Пользователь
 
Регистрация: 28.03.2011
Сообщений: 51
По умолчанию

Цитата:
Сообщение от veniside Посмотреть сообщение
> отвечает за доступ к файлу в асинхронном режиме

верно, но читаете вы синхронно, так что флаг этот просто не нужен.

> если его убрать то при запуске приложения оно сразу же вызывает исключение и завершается

в какой строке возникает исключение?

> Invalid parameter (Неверно задан параметр)

четвертый параметр у ReadFile() не может быть NULL при синхронном чтении, может из-за этого

Код:
sizeof(&bmiHeader)
& тут лишний
Необработанное исключение в "0x7536abc3" в "BMP_READ.exe": 0xC0000005: Нарушение прав доступа при записи "0x00000000" вызывается в
Код:
 // читаем заголовок файла
   if (!(ReadFile(FileHandle,&bmfHeader,sizeof(bmfHeader),NULL,NULL) )) {
	   fputs( "Eror header reads",stderr );
	   cout << GetLastError();
& действительно лишний, убрал

Последний раз редактировалось Neolit1819; 08.04.2011 в 14:55.
Neolit1819 вне форума Ответить с цитированием
Старый 08.04.2011, 15:20   #6
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

Ну как минимум четвертый параметр не должен быть NULL.
Это должен быть указатель на переменную, которая получит число реально прочитанных байт.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 08.04.2011, 15:45   #7
Neolit1819
Пользователь
 
Регистрация: 28.03.2011
Сообщений: 51
По умолчанию

Заменил NULL на DWORD bf Заработало! спасибо!
Neolit1819 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
C++ и WinApi? genrix Свободное общение 8 31.03.2011 11:18
Не сохраняет файлы (Создает файлы пустышки) Rock231 Помощь студентам 2 25.12.2010 12:31
два вредных вопроса:про асю и прикриплёные файлы файлы steck Свободное общение 3 17.06.2007 14:53
WinApi Andr Безопасность, Шифрование 3 17.06.2007 13:38