Как настроить Alignment

Игорь Павлов

Известно, что все структуры, определенные для обмена между FAR'ом и плагинами, должны быть откомпилированы при alignment = 1 (или 2). Чтобы не возникало проблем у авторов плагинов, файл "plugin.hpp" содержит следующие конструкции:

#if defined(__BORLANDC__) && (__BORLANDC <= 0x520)
  #pragma option -a1
#elif defined(__GNUC__) || (defined(__WATCOMC__) && (__WATCOMC__ < 1100))
  #pragma pack(1)
#else
  #pragma pack(push,1)
  #if _MSC_VER
    #define _export
  #endif
#endif

...


#if defined(__BORLANDC__) && (__BORLANDC <= 0x520)
  #pragma option -a.
#elif defined(__GNUC__) || (defined(__WATCOMC__) && (__WATCOMC__ < 1100))
  #pragma pack()
#else
  #pragma pack(pop)
#endif

Они устанавливают значение alignment = 1 для всех структур, определенных в "plugin.hpp". Но структура PluginPanelItem включает в себя структуру WIN32_FIND_DATA из Win32 SDK:

PluginPanelItem
{
  WIN32_FIND_DATA FindData;
...

Т.е. при работе с PluginPanelItem крайне важно, чтобы структура WIN32_FIND_DATA была откомпилирована со значением alignment = 1 (или 2). Но WIN32_FIND_DATA определена в одном из h файлов Win32 SDK. Это означает, что значение alignment для нее не зависит от "plugin.hpp". Здесь и может возникнуть ошибка.

Михаил Юцис в файле "VCReadme.txt", который идет в комплекте с FAR Plugin API, советует компилировать весь проект при alignment = 2 (или 1). Тогда sizeof(WIN32_FIND_DATA) = 318 (OK для FAR'а). Но для нового проекта по умолчанию стоит значение alignment = 8 и sizeof(WIN32_FIND_DATA) = 320 (а FAR считает, что 318). Т.е. нужно изменить значение в Project / Settings / C/C++ / Code Generation / Struct member alignment на 1 или 2. Но тогда возникает другая проблема. В Win32 есть файлы, которые должны быть скомпилированы при alignment = 8. Например, <wincon.h>, который содержит структуры из Console API. Михаил Юцис для решения этой проблемы предлагает следующий трюк:

#define _WINCON_      // предотвратить включение wincon.h
#include <windows.h>
#undef _WINCON_
#include "plugin.hpp" // этот файл хочет 1-byte alignment
#pragma pack(8)
#include <wincon.h>   // этот файл хочет 8-bytes alignment

Но существует другое решение, которое предложил Евгений Рошал. Достаточно лишь определить в файле "plugin.hpp" структуру FarFindData

struct FarFindData
{
  DWORD dwFileAttributes;
  FILETIME ftCreationTime;
  FILETIME ftLastAccessTime;
  FILETIME ftLastWriteTime;
  DWORD nFileSizeHigh;
  DWORD nFileSizeLow;
  DWORD dwReserved0;
  DWORD dwReserved1;
  char cFileName[ MAX_PATH ];
  char cAlternateFileName[ 14 ];
};

и заменить WIN32_FIND_DATA на FarFindData:

PluginPanelItem
{
  FarFindData FindData;
...

А компилировать проект следует при alignment = 8.

Какие преимущества от такого метода:

Хотя Евгений и предложил это решение, он пока не хочет распространять его на официальную версию, т.к. для некоторых плагинов потребуется вносить небольшие изменения.


 
24.12.1999
наверх