Как настроить Alignment (extended)

Alex Yaroslavky []

В продолжение статьи "Как настроить Alignment" Игоря Павлова, я пишу здесь объяснения того, как установить правильное выравнивание при компиляции плагинов для FAR, используя LCC-WIN32 или Borland C++ 5.5 (free commandline tool).

LCC-WIN32:

Вы должны найти файл, который называется win.h в каталоге lcc\include\. Затем ищете в нём строку "WIN32_FIND_DATA", вы увидите определение структуры подобно этому:

typedef struct _WIN32_FIND_DATA {
  DWORD dwFileAttributes;
  FILETIME ftCreationTime;
  FILETIME ftLastAccessTime;
  FILETIME ftLastWriteTime;
  DWORD nFileSizeHigh;
  DWORD nFileSizeLow;
  DWORD dwReserved0;
  DWORD dwReserved1;
  TCHAR cFileName[MAX_PATH];
  TCHAR cAlternateFileName[14];
  WORD dummy;
} WIN32_FIND_DATA,*LPWIN32_FIND_DATA,*PWIN32_FIND_DATA;

Для правильной компиляции plugin.hpp или для получения размера структуры PluginPanelItem 366 байт нам нужно, чтобы вышеупомянутая структура была равна 318 байтам, единственное что мешает этому, так это поле 'WORD dummy' в конце структуры, которое не нужно в этой структуре и добавлено автором LCC по причине, мне неизвестной (может он тоже был озабочен выраниванием :). Так что оно может быть удалено, просто закомментируйте строчку с фиктивной переменной. Вы всё сделали, теперь вы можете счастливо компилировать ваш плагин, только не забудьте использовать ключ -Zp2, чтобы установить выравнивание в 2 байта.

P.S. также не забудьте установить ключ -nounderscores при линковке, чтобы имена функций экспортировались правильно.

Borland C++ 5.5 (free commandline tool):

Вы должны найти файл, называемый winbase.h в каталоге bcc\include\. Затем в начале файла вы увидите что-то вроде этого:

#ifndef _WINBASE_
#pragma option push -b -a8 -pc -A- /*P_O_Push*/
#define _WINBASE_

Для правильной компиляции plugin.hpp или для получения размера структуры PluginPanelItem 366 байт нам нужно, чтобы вышеупомянутая структура была равна 318 байтам. Чтобы установить этот размер, нужно компилировать winbase.h с выравниванием 2 байта, для чего вы должны изменить "-a8" на "-a2" в описанных выше строках.

Другая проблема - проверка размера структуры PluginPanelItem в plugin.hpp.

Выглядит это так:

#if defined(__BORLANDC__)
#if sizeof(PluginPanelItem) != 366
#if defined(STRICT)
#error Incorrect alignment: sizeof(PluginPanelItem)!=366
#else
#pragma message Incorrect alignment: sizeof(PluginPanelItem)!=366
#endif
#endif
#endif

В Borland C++ 5.5 команда "sizeof(PluginPanelItem)" делает не то, что ожидалось, так что вы всегда будете получать эту ошибку. Что вам нужно сделать, так это изменить строку на "sizeof(struct PluginPanelItem) != 366" чтобы сделать это очевидным. Вы всё сделали, теперь вы можете счастливо компилировать ваш плагин, только не забудьте использовать ключ -a2, чтобы установить выравнивание в 2 байта.


 
04.12.2001
наверх