CyberArticle导出插件

CyberArticle导出插件是一个COM组件,该组件必须支持自动化技术(实现IDispatch)。CyberArticle通过IDispatch接口来调用相应的方法,来将文章导出为文件。

COM对象需要的属性:

属性名称
属性类型
读写
是否必须
描述
PluginFlags
整数(VT_I4)
CyberArticle会通过读取该属性,来获得插件的一些属性。可能的值:
#define EXPORTP_PLUGIN_CAN_CONFIG                    0x00000001    //允许用户设置插件
#define EXPORTP_PLUGIN_CONFIG_FILE_SIZE              0x00000002    //允许设置进行导出的文件大小
#define EXPORTP_PLUGIN_CONFIG_ENCODING               0x00000004    //允许设置进行导出的文件的编码
ExportFlags
整数(VT_I4)
CyberArticle会通过向插件设置该属性,通知插件,用户进行的一些设置。可以有一个或者多个下面的值:
 
#define EXPORT_OPTIONS_TITLE_AS_FILE_NAME             0x00000001    //设置文章标题作为文件名
#define EXPORT_OPTIONS_ID_AS_FILE_NAME                0x00000002    //设置文章ID作为文件名
#define EXPORT_OPTIONS_URL_AS_FILE_NAME               0x00000003    //设置文章网址作为文件名
#define EXPORT_OPTIONS_OVERWRITE_EXISTING_FILES       0x00000010    //覆盖已经存在的文件
#define EXPORT_OPTIONS_ENCODING_UTF16                 0x00001000    //设置导出的文件编码为UTF16
#define EXPORT_OPTIONS_ENCODING_ALLOW_UTF8            0x00002000    //设置导出的文件编码允许使用UTF-8
注意
EXPORT_OPTIONS_TITLE_AS_FILE_NAME,
EXPORT_OPTIONS_ID_AS_FILE_NAME,
EXPORT_OPTIONS_URL_AS_FILE_NAME
这三个选项,不回合并使用,同一时间,只有一个有效。

COM对象需要的方法:

方法
是否必须
描述
Export
CyberArticle会调用该方法,用来导入一个文件。
 
参数
索引
类型
描述
1
[in] IDispatch*
ICANode*对象,需要导出的CyberArticle文章对象。
2
[in] BSTR
需要导出的目标文件夹
 
返回值
类型:VARIANT。必须是一个元素类型为VARIANT的SAFEARRAY数组。数组内,每一个元素都是一个VARIANT,该VARIANT的类型是BSTR。
通过该数组,返回导出生成的文件名。例如,如果导出文章中的图片,则通过该数组,返回导出的每一个图片的文件名。
 
在WizHelper.h文件中,提供了一个辅助函数WizStringArrayToVariant,用来将一个CString数组,转换成一个VARIANT。
 
typedef std::vector<CString> CWizStdStringArray;

inline BOOL WizStringArrayToVariant(const CWizStdStringArray& arrayText, VARIANT& v)
{
    ULONG nCount = ULONG(arrayText.size());
    CComSafeArray<VARIANT> varray(nCount);
    for (ULONG i = 0; i < nCount; i++)
    {
        varray.SetAt(i, CComVariant(CComBSTR(arrayText[i])));
    }
    CComVariant vTemp(varray.m_psa);
    //
    VariantCopy(&v, &vTemp);
    //
    return TRUE;
} 
Config
CyberArticle会调用该方法,让用户进行设置。
 
参数
 
返回值
 
注意:如果实现了该方法,您必须在PluginFlags属性中,返回EXPORT_PLUGIN_CAN_CONFIG。
 
下面是一个比较典型的idl文件片断
interface ICAExportImage : IDispatch{
    [propget, id(1), helpstring("property PluginFlags")] HRESULT PluginFlags([out, retval] LONG* pVal);
    [propput, id(2), helpstring("property ExportFlags")] HRESULT ExportFlags([in] LONG newVal);
    [id(3), helpstring("method Export")] HRESULT Export([in] IDispatch* pNodeDisp, [in] BSTR bstrPath, [out,retval] VARIANT* pvResultFiles);
};

注册导出插件

当您完成COM组件编写后,您还需要注册您的COM组件。除了标准的COM组件注册外,还需要在注册表的某些位置,写入一些数据,来告诉CyberArticle,有这样一个CyberArticle导出插件。
 
CyberArticle导出插件注册位置:
    HKEY_CURRENT_USER\Software\Wizissoft\CyberArticle\Plugins\Export  (仅对当前windows用户有效)
或者
    HKEY_LOCAL_MACHINE\Software\Wizissoft\CyberArticle\Plugins\Export (对当前电脑的所有用户有效)
 
导出插件组件需要在上面的注册表位置下面,创建一个新的KEY,KEY的名称是COM组件的Class ID (CLSID),在这个KEY下面,默认的value是该插件的描述。
下图就是一个典型的例子:
 
 
 
在卸载插件的时候,需要将相应的注册表项,从注册表中删除。
 
如果您使用C++编写插件,可以使用CyberArticleExportPluginHelper.h文件里面的函数注册一个CyberArticle导出插件,例如:
 
#include "C:/Program Files/Wizissoft/CyberArticle/developers/interface/include/CyberArticleExportPluginHelper.h"
...
// DllRegisterServer - Adds entries to the system registry
STDAPI DllRegisterServer(void)
{
    // registers object, typelib and all interfaces in typelib
    HRESULT hr = _AtlModule.DllRegisterServer();
    if (SUCCEEDED(hr))
    {        
        /*        
        *注册CyberArticle导出插件        
         */
        CyberArticleRegisterExportPlugin(CLSID_CAExportImage, _T("图片"));
    }
    return hr;
}


// DllUnregisterServer - Removes entries from the system registry
STDAPI DllUnregisterServer(void)
{
    /*    
    *卸载CyberArticle导出插件    
    */
    CyberArticleUnregisterExportPlugin(CLSID_CAExportImage);
    //
    HRESULT hr = _AtlModule.DllUnregisterServer();
    return hr;
}