Игорь Павлов
Известно, что все структуры, определенные для обмена между 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