KeePass
密码管理器




Package

如何为KeePass 1.x开发插件


信息  要求

在开始开发KeePass插件之前,您需要满足以下先决条件:

  • 最新的KeePass源代码包。您可以从 KeePass网站获取
  • C ++开发IDE /编译器。
  • Windows平台SDK。

KeePass插件API使用组件对象模型(COM)标准的一些概念。如果您没有使用COM的经验,建议您阅读以下页面:

信息  循序渐进的教程

启动您最喜欢的IDE并创建一个新的Win32项目(应用程序类型DLL,空项目)。在本教程中,我们正在开发的示例插件被调用TestPlugin。在新项目中创建两个文件:C ++源文件(TestPlugin.cpp)和头文件(TestPlugin.h)。

要访问KeePass接口,您必须包含KeePass SDK中的头文件:#includeTestPlugin.h文件中放置一个语句,该 文件包含KeePassLibCpp/SDK/KpSDK.hKeePass源代码中的文件 。

Windows DLL可以选择实现一个DllMain功能。因此,如果你想要一个(虽然不是KeePass所要求的),现在在TestPlugin.cpp文件中实现一个默认的(只是总是返回 TRUE):

BOOL WINAPI DllMain(HINSTANCE hinstDLL,DWORD fdwReason,LPVOID lpvReserved)
{
	UNREFERENCED_PARAMETER(hinstDLL);
	UNREFERENCED_PARAMETER(fdwReason);
	UNREFERENCED_PARAMETER(lpvReserved);

	返回TRUE;
}

下一步是创建一个必须实现该IKpPlugin接口的插件类 。因此,查找IKpPlugin接口(抽象C ++类)并设计一个实现所有这些方法的类。

现在导出一个函数,KeePass将使用该函数创建插件类的实例:
KP_EXPORT HRESULT KP_API KP_I_CREATEINSTANCE_DECL(REFIID riid, void** ppvObject, IKpUnknown* pAPI);
在此函数中,您需要创建插件类的实例并riidppvObject参数中存储KeePass()请求类型的接口指针。该pAPI参数是一个指向KeePass API的接口指针,您应该存储该指针以供以后使用,以防您能够返回有效的插件接口。

KeePass目前仅作为ANSI应用程序提供,而不是Unicode。因此,转到Project→Test Plugin Properties并选择 Multi Byte作为字符集。

建议(但不要求)静态链接运行时库(和MFC,如果您正在使用它)。要执行此操作,请转到 项目→测试插件属性→C / C ++→代码生成, 然后选择不以’-DLL’结尾的运行时库。

构建插件之前的最后一步是添加版本信息资源。因此,转到插件项目的“资源”选项卡并添加“版本”类型的资源。在这里,将产品名称设置为 KeePass Plugin。所有其他字段可以自由设置为您选择的字符串。

例。您可以在KeePass插件网页(“测试插件”)上找到这个简单插件的完整文档和扩展版本。

信息  插件约定和建议

约定:

  • DLL文件必须具有版本信息资源,产品名称设置为该资源KeePass Plugin。KeePass使用它来确定DLL是否是KeePass插件(即如果您没有使用此字符串创建版本信息资源,KeePass将不会加载您的DLL文件)。
  • 如果要使用名称“KeePass”作为插件名称的一部分,请直接添加/附加非数字前缀/后缀。例如,“KeePassSync”没问题,但“KeePass Sync”没有。
  • KeePass插件必须导出以下函数:
    KP_EXPORT HRESULT KP_API KP_I_CREATEINSTANCE_DECL(REFIID riid, void** ppvObject, IKpUnknown* pAPI);

    KeePass将调用此函数来创建插件类的实例。 如果您的插件类支持此接口(返回),则必须riidppvObject参数中返回类型的接口S_OK。否则设置ppvObjectNULL并返回 E_NOINTERFACE。您可以存储pAPI接口指针以供以后使用。KeePass保证指针有效,只要它有一个指向插件类实例的指针即可。

    重要提示:明确检查KeePass询问的接口(riid),否则您的插件不向上兼容,并且可能在将来的KeePass版本中崩溃。

  • KeePass插件可以选择导出以下函数: KeePass将在加载DLL后调用第一个函数,第二个函数在DLL卸载之前不久。 您不应存储接口指针以供以后使用。将指针视为临时指针; 当你从返回他们可能成为尽快无效或 功能。该接口的指针值传递给 和不保证是彼此相同,或者它被传递到指针值。
    KP_EXPORT HRESULT KP_API KP_I_INITIALIZELIB_DECL(IKpUnknown* pAPI);
    KP_EXPORT HRESULT KP_API KP_I_RELEASELIB_DECL(IKpUnknown* pAPI);

    pAPIKP_I_INITIALIZELIB_DECLKP_I_RELEASELIB_DECLpAPIKP_I_INITIALIZELIB_DECLKP_I_RELEASELIB_DECLKP_I_CREATEINSTANCE_DECL

  • 协议是DllMain(如果存在), KP_I_INITIALIZELIB_DECL(如果存在) KP_I_CREATEINSTANCE_DECL,插件接口方法 KP_I_RELEASELIB_DECL(如果存在)。
  • KeePass使用多字节字符集。因此,请确保您还在多字节字符集模式下编译插件,而不是Unicode。

建议:

  • 所有插件文件都应以通用前缀开头。例如,如果您的插件名为VariousImport,则DLL文件可能名为 VariousImport.dll,其帮助文件为VariousImport.html。如果不使用公共前缀,用户可能会在安装多个插件时遇到覆盖问题,因为必须将所有插件复制到KeePass应用程序目录中。例如,如果有一个附带ReadMe.txt文件的插件和另一个附带此类文件的插件,则后者会覆盖第一个的自述文件,或者用户选择不覆盖,而第二个的自述文件插件不可用。使用公共前缀可以避免此问题。
  • 版本信息块至少应该以英语(美国)语言提供。
  • IKpConfig接口有两种实现方式。一种实现方式是通过鉴定CLSID_KpConfig,其他的 CLSID_KpConfig_ReadOnly。第一个支持阅读和写作,第二个只支持阅读。如果您只想读取配置项,强烈建议您使用第二种实现。如果KeePass在调试模式下编译,则

    尝试使用该CLSID_KpConfig_ReadOnly实现进行写入将断言,并且将在释放模式下失败(并且可能会破坏当前配置的部分)。

信息  将插件从≤1.14升级到≥1.15

将插件从KeePass≤1.14升级到≥1.15时,强烈建议您创建一个新的项目文件,从头开始并使用旧代码复制/填写接口方法。

笔记:

  • 没有KeePass.lib档案了。新的插件架构基于接口。KpSDK.h您只需要包含 头文件即可。

    不要使用KeePass源代码中的任何文件进行编译,也不要包含任何其他头文件KpSDK.h

  • 以前通过设置cmdLineArgPrefix插件信息结构的成员来注册命令行前缀 。在新体系结构中,GetProperty使用KPPS_COMMANDLINEARGPREFIX参数调用时,必须通过插件接口的成员方法返回命令行前缀 。

    GetProperty可能看起来像这样:

    STDMETHODIMP_(LPCTSTR)CYourPluginImpl :: GetProperty(LPCTSTR lpName)
    {
    	if(lpName == NULL)返回NULL;
    
    	if(_tcscmp(lpName,KPPS_COMMANDLINEARGPREFIX)== 0)
    		return _T(“mypluginprefix。”);
    
    	返回NULL;
    }

    在加载所有插件之前,插件不应访问KeePass命令行。这是因为当时KeePass当然不能调用GetProperty你的插件的方法,因此还不知道前缀(这将导致’未知的命令行选项’警告)。相反,当KeePass OnMessage使用KPM_DELAYED_INIT代码调用处理程序方法时,执行与命令行相关的初始化。

信息  C ++的插件框架

感谢Bill Rubin,有一个可选的插件框架,可以促进用C ++开发KeePass插件。功能详细:

  1. 完整的IID_IKpUnknown接口实现。
  2. IID_IKpPlugin接口的实现,除了 OnMessage成员函数,它始终是特定于应用程序的。
  3. 能够让智能指针到任何其他KeePass的接口,包括IKpAPIIKPCommandLine, IKpCommandLineOptionIKpConfig, IKpDatabaseIKpFullPathName,和IKpUtilities
  4. KpCreateInstance函数的实现,插件必须从其DLL导出。
  5. 对项目3和4的COM握手进行全面错误检查。如果发现错误,PFK将显示一个消息框,其中包含有关错误的所有信息。如果没有此功能,在大多数情况下,插件将无法加载。在其他情况下,它将无法执行其功能。
  6. 方便实用程序显示消息框,将Windows错误代码转换为自然语言字符串,并声明独立于字符类型的标准字符串。
  7. 编译时检查智能COM指针的构造函数调用。如果没有此功能,开发人员很难解释使用错误的智能COM指针构造函数导致的编译器错误消息。
  8. PFK代码避免定义宏。相反,模板,内联函数,typedef和其他C ++构造维护安全的设计实践,没有运行时损失。

还有一个使用插件框架可用的测试插件

上一页:
下一页:


沪ICP备19023926号-2 Copyright © 2003-2019 Dominik Reichl, [联系我们 / 版本说明] [团队 & 隐私政策]