Корректировка PLUGIN.HPP

Валентин Скирдин [vskirdin@mail.ru]vskirdin@mail.ru

Замечание Замечание

Всем, кто хоть раз пробовал писать плагины для FAR Manager, известен заголовочный файл PLUGIN.HPP (его можно найти здесь: %FAR%\PlugDoc.rar:plugin.hpp - ред: начиная с FAR 1.70 beta 5 примеры устанавливаются в отдельный каталог PlugDoc). Но, к сожалению (с моей точки зрения), это чистой воды полуфабрикат. Здесь я предлагая некоторые "доработки" этого заголовочного файла, т.с. приведение содержимого файла к некоему стандарту. Доработок совсем немного, но эти доработки (IMHO) весьма полезные.

Первое, что мы сделаем - исключим повторную прекомпиляцию PLUGIN.HPP (это тот этап, на котором компилятор наполняет свои внутренние таблицы информацией из C/CPP и H/HPP -файлов - имена, типы, and etc.). Для этого достаточно в начало PLUGIN.HPP следующие строки:

#ifndef __PLUGIN_HPP
#define __PLUGIN_HPP

//#include <windows.h>

...а самой последней строкой поставить:

#endif // __PLUGIN_HPP

На втором этапе внесем некоторые коррекции для директив компиляции, с учетом знаний о компиляторе LCC-Win32...

...
#elif defined(__GNUC__) || (defined(__WATCOMC__) && (__WATCOMC__ < 1100)) || defined(__LCC__)
  #pragma pack(1)
  #if defined(__LCC__)
    #define _export __declspec(dllexport)
  #endif
#else
...

...в конце необходимо тоже внести изменения:

...
#elif defined(__GNUC__) || (defined(__WATCOMC__) && (__WATCOMC__ < 1100)) || defined(__LCC__)
  #pragma pack()
#else
...

Третий этап - перечислим прототипы всех экспортируемых API-функций. Но сделаем это несколько необычно - заключим прототипы в "скобки" (выделено), а также учтем "пожелания" компилятора LCC-Win32 (по поводу остальных компиляторов ничего не скажу, т.к. "общался" только с Borland C и LCC-Win32):

#if defined(__BORLANDC__)
#ifdef __cplusplus
extern "C" {
#endif

void WINAPI _export ClosePlugin(HANDLE hPlugin);
.
.
.
int WINAPI _export ProcessEditorEvent(int Event,void *Param);

#ifdef __cplusplus
};
#endif
#endif

Многие компиляторы, встретив файл с расширением CPP, переключаются в режим С++. А в этом режиме, как известно, имена функций "коверкаются" компилятором с тем, чтобы была возможность перегрузки имен функций (более детальную информацию по этому вопросу смотрите в учебниках по С++ - например здесь). Но так, как FAR Manager ожидает от нашего плагина вполне конкретные имена функций, то...

И, напоследок, скопируем полученный файл PLUGIN.HPP в каталог INCLUDE с тем, чтобы не размножать на диске копии этого файла, а просто взять и в исходнике написать:

#include <plugin.hpp>

Кстати, тоже самое проделайте и с FMT.HPP (если, конечно, пишите плагины второго уровня для плагина MultiArc)


 
02.01.2000
Rev 13.02.2000
наверх