RU/2: Форум. Общение пользователей и разработчиков OS/2 (eCS). : Танец Шамана с бубном или программирование...


Список сообщений | Написать новое | Ответить на сообщение | Домой Поиск:
Предыдущее сообщение | Следующее сообщение
From : San Sanych
To : All
Subj : Танец Шамана с бубном или программирование...

Дано:
File[NumFile].Name=<имя двоичного файла размер которого равен 6101 байтов>
File[NumFile].Adres=смещение в байтах от начала массива ImageRom куда загружаем упомянутый файл

Программа(почти вся):

typedef unsigned char BYTE;
typedef unsigned long DWORD;
#define SIZE_ROM_FILE (128*1024)
#define MAX_BIN_FILE 3

BYTE ImageRom[SIZE_ROM_FILE];

typedef struct {
char Name[280];
DWORD Adres;
} FILEDATA;

FILEDATA File[MAX_BIN_FILE];


// первый способ
void LoadBin(BYTE NumFile)
{
FILE * hFile;
DWORD CurSize;

if ((hFile=fopen(File[NumFile].Name,"rb")) == NULL)
{
ErrExit("Невозможно открыть входной файл %s",File[NumFile].Name);
};
CurSize = fread(ImageRom+File[NumFile].Adres,1,SIZE_ROM_FILE,hFile);
fclose(hFile);
printf("Адрес '%x'\n",ImageRom+File[NumFile].Adres);
printf("Длина входного файла '%d'\n",CurSize);
if (CurSize == 0)
{
ErrExit("Длина входного файла не правильная %ud",CurSize);
};
};

// второй способ
void LoadBin(BYTE NumFile)
{
FILE * hFile;
DWORD CurSize;

if ((hFile=fopen(File[NumFile].Name,"rb")) == NULL)
{
ErrExit("Невозможно открыть входной файл %s",File[NumFile].Name);
};
CurSize = fread(ImageRom+File[NumFile].Adres,1,6101,hFile);
fclose(hFile);
printf("Адрес '%x'\n",ImageRom+File[NumFile].Adres);
printf("Длина входного файла '%d'\n",CurSize);
if (CurSize == 0)
{
ErrExit("Длина входного файла не правильная %ud",CurSize);
};
};

Компилим для работы под NT

Первый вариант:
Под виндами 95, 98, NT4sp5
Дык вот в зависимости от значения смещения (File[NumFile].Adres) получаем либо
правильное значение загруженного файла либо нулевую длину.
(хотим считать 128КБ, а файл длинной 6101)

Второй вариант:
Под виндами 95
Когда явно указываем сколько хотим считать те 6101, то при любом значении смещения
все ОК.

НО если запускать этот же test.exe в ODIN через "PE test.exe" под OS/2 ТО ОБА варианта работаю правильно.
И если компилить чисто под OS/2 то так же ОБА варианта работаю правильно.

Вопрос: где грабли ?
Доп вопрос: Как узнать длину файла ? ( используя стандартную библиотеку Watcom).

Справка:
функция fread() пытается считать заданное число байтов и возвращает реальное
значение считанных байтов.
PS: могу мылом выслать исходник и test.exe

Mon 03 Dec 2001 18:39 Mozilla/4.61 [en] (OS/2; U) via Smart Cache 0.49




Programmed by Dmitri Maximovich, Dmitry I. Platonoff, Eugen Kuleshov.
25.09.99 (c) 1999, RU/2. All rights reserved.
Rewritten by Dmitry Ban. All rights ignored.