Far Manager插件编写1

由于大部分时间都是使用Far程序,于是想写个插件提升效率,但是网上都没有相关的资料,而且官方提供的文档也只有老毛子语。只能自己摸索摸索。写在博客希望能帮助更多的人少走弯路。

Far Manager(short for File and ARchive Manager),是一款Windows文件管理视图,并且可以执行cmd命令。提供了高度可定制的插件接口。

插件编写

Far插件是一个dll文件,通过Far提供的接口来实现高度可定制化的插件。将该dll文件放入Far的插件目录,调用插件时会加载该dll。

GetGlobalInfoW

Far加载插件时,最先加载就是插件导出的GetGlobalInfoW函数,如果没有导出该函数,这个插件也就不能被Far调用。这个函数主要的功能是提供插件的基本信息。如作者、插件版本、描述和插件路径、GUID等等。

// {1C6B0907-0B96-47C4-A24B-36A9B184AF25}
static const GUID guid_PluginGuid =
{ 0x1c6b0907, 0xb96, 0x47c4,{ 0xa2, 0x4b, 0x36, 0xa9, 0xb1, 0x84, 0xaf, 0x25 } };  //全局变量

void WINAPI GetGlobalInfoW(GlobalInfo *Info)
{
    Info->MinFarVersion = MAKEFARVERSION(
        FARMANAGERVERSION_MAJOR,
        FARMANAGERVERSION_MINOR,
        FARMANAGERVERSION_REVISION,
        FARMANAGERVERSION_BUILD,
        FARMANAGERVERSION_STAGE);

    Info->StructSize = sizeof(GlobalInfo);
    Info->Author = L"Ken";
    Info->Description = L"My First Plugin";
    Info->Title = L"My First Plugin";
    Info->Guid = guid_PluginGuid;
}

在该函数内初始化GlobalInfo即可。注意要导出该函数。guid可使用VS的创建GUID生成,注意必须是唯一的

显示插件菜单

我们填充了插件的基本信息,但是按F11弹出的插件菜单是没有该插件菜单的(我截的图有该插件,不要在意这些细节)。我们就需要导出另一个函数GetPluginInfoW。该函数提供插件更多信息。

// {1D228F40-FE40-4663-92D9-EB184E455AF1}
static const GUID guid_PluginMenu =
{ 0x1d228f40, 0xfe40, 0x4663,{ 0x92, 0xd9, 0xeb, 0x18, 0x4e, 0x45, 0x5a, 0xf1 } }; //全局变量

void WINAPI  GetPluginInfoW(PluginInfo *Info)
{
    static wchar_t* szMenu;
    szMenu = _T("First Plugin");

    Info->StructSize = sizeof(PluginInfo);
    Info->Flags = PF_FULLCMDLINE;
    Info->CommandPrefix = szMenu;

    //插件菜单,要在插件菜单中显示菜单,必须初始化这三项,缺一不可,不然会报错
    Info->PluginMenu.Count = 1;
    Info->PluginMenu.Guids = &guid_PluginMenu;
    Info->PluginMenu.Strings = &szMenu;//插件菜单显示的名字
}

插件和插件菜单都有一个GUID来标识插件和插件菜单。

SetStartupInfoW

这个函数也是需要导出的函数,这个函数很重要,如果没有导出这个函数,Far的很多功能都不能够实现。这个函数主要的功能就是将PluginStartupInfo结构传给该插件,因此我们要定义全局变量接收这个结构以便整个插件能使用该结构。这个结构提供了对话框、消息框、插件控制、视图编辑器、文本面板控制等功能。

//固定用法
PluginStartupInfo psi; \\不能使用指针
FarStandardFunctions fsf; \\不能使用指针

void WINAPI SetStartupInfoW(const PluginStartupInfo *Info)
{
    //传递给全局变量,以便在后面调用。
    psi = *Info;
    fsf = *Info->FSF; 
    psi.FSF = &fsf;//因为从info传递给pis的结构中的fsf结构体不是在该插件dll文内。
}

这里定义的psi和fsf在后面还会用到很多。
导出了这三个函数我们就可以实现更多的内容了。

×

纯属好玩

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

文章目录
  1. 1. 插件编写
    1. 1.1. GetGlobalInfoW
    2. 1.2. 显示插件菜单
    3. 1.3. SetStartupInfoW
,