-
CyberArticle二次开发手册 – 5、CyberArticle 文章
发表于 2009年06月4日 没有评论每一个CyberArticle文章,都是一个HTML文件。CyberArticle将HTML以及所包含的图片等资源,打包并压缩成一个zip数据包,保存在数据库的Nodes.Article字段内。
文章节点,都有一个Article属性,可以获得HTML文章对象(ICAArticle)。
ICAArticle对象的主要属性和方法
- SaveAsHTML:保存成一个HTML文件。采用unicode编码。
- SaveAsHTMLAnsi:保存成一个HTML文件,采用ansi或者多字节编码,例如gb2312,utf-8等编码。具体编码,由html文件里面原始的编码指定。如果原始编码是unicode,则保存后采用utf-8编码。
- SaveAsHTMLAnsiEx:保存成HTML文件,采用ansi或者多字节编码。可以指定是否允许使用utf-8编码。如果不允许使用utf-8,则会采用当前系统的默认字符集老保存那些unicode文件。
- SaveAsMime:保存成mime文件,扩展名一般是.mht。
- Children属性:或者HTML资源(ICAArticleResourceCollection)。
ICAArticleResourceCollection说明
ICAArticleResourceCollection是一个文章资源集合,除了具有Count和Item两个属性外,还有其它几个重要的方法。利用这个对象,可以删除或者更新某一个文章资源,例如更新或者删除里面的某一个图片。
- Count:获得HTML资源的数量。包括HTML代码本身。
- Item:活的某一个资源。Item(0)就是文章的HTML代码(ICAArticleResource)。
- ItemFromName:通过资源名称,获得某一个资源。按照名称查找的时候,不区分大小写。
- BeginUpdate:开始更新资源。如果要删除或者更新某一个资源,在删除或者更新之前,需要调用该方法。
- EndUpdate:结束更新资源。如果要删除或者更新某一个资源,在删除或者更新之后,需要调用该方法。调用之后,会把修改后的数据保存到数据库。
- GetArticleSourceCode:获得文章的HTML代码。在调用GetArticleSourceCode之前,不需要调用BeginUpdate。
- SetArticleSourceCode:设置文章的HTML代码。在调用SetArticleSourceCode之前,也需要调用BeginUpdate。之后调用EndUpdate,才会保存数据。
ICAArticleResourceCollection对象主要的功能,就是可以单独更新或者删除某一个资源。
ICAArticleResource对象主要属性和方法
通过ICAArticleResourceCollection.Item,可以获得每一个文章资源。文章资源对象就是ICAArticleResource。
- Name:资源名称,就是保存成HTML之后的文件名(不包含路径)
- URL:资源的URL,例如HTML里面的某一个图片的原始URL。
- Size:资源的大小。
- SaveToStream:将资源数据,保存到一个IStream里面。
例子
下面的代码,我们在一个书籍内建立一个新的文章,然后把文章保存成HTML文件,并且获得其中的每一个文章资源,显示出文章资源的名称和URL。
var objShell = new ActiveXObject(“WScript.Shell”);
function jsAlert(msg)
{
return objShell.Popup(msg, 10000, “CyberArticle”, 0);
}
function Test()
{
var objBookCollection = new ActiveXObject(“CyberArticleBook.CABookCollection”);
for (var i = 0; i < objBookCollection.Count; i++)
{
var objBook = new ActiveXObject(“CyberArticleBook.CABook”); //创建ICABook对象
//
var guidBook = objBookCollection.GUID(i); //获得书籍的GUID
try
{
objBook.Open(guidBook); //打开书籍
}
catch (e)
{
continue;
}
//…
var nodeRoot = objBook.RootNode;
//
var nodeArticle = objBook.CreateArticle(nodeRoot, “My Article”); //创建文章
//文章html
var htmlText = “<html><head><title>My First SDK Article</title></head><body><h1>My First SDK Article</h1><p>Test text…</p><img src=http://www.wizbrother.com/screenshots/cyberarticle.png></img></body></html>”;
//创建一个profile
var objProfile = new ActiveXObject(“CyberArticleBook.CAProfile”);
objProfile.Name = “Test”;
objProfile.IncludeImages = true;
objProfile.DownloadItems = true;
//使用html文字设置文章内容
nodeArticle.InitArticle(htmlText, “”, objProfile);
//
var objArticle = nodeArticle.Article; //获得ICAArticle对象
objArticle.SaveAsHTML(“T:\\temp\\1.htm”); //保存成HTML文件
//
var objArticleResourceCollection = objArticle.Children; //获得ICAArticleResourceCollection
for (var iResource = 0; iResource < objArticleResourceCollection.Count; iResource++)
{
var objArticleResource = objArticleResourceCollection.Item(iResource);
//
if (0 == iResource)
{
//第一个资源,显示HTML代码
jsAlert(objArticleResourceCollection.GetArticleSourceCode());
}
else
{
//显示资源名称和URL
jsAlert(objArticleResource.Name + “\n” + objArticleResource.URL);
}
}
//…
objBook.Close();
//
return;
}
}
Test();程序运行后的效果如下图:
Item(0),显示文章HTML代码。注意看里面有一个%ResourceFilePath% / cyberarticle[1].png。在CyberArticle保存后的HTML代码里面,%ResourceFilePath%代表了HTML资源所在的子目录名称,例如xxx_files。在保存成html的时候,CyberArticle会自动替换。

下面显示了资源的名称和URL(就是初始化html的时候引用的图片)。

从上面的的例子中可以看到,通过文章对象,可以轻松的操作CyberArticle里面的文章。
-
CyberArticle二次开发手册 – 4、CyberArticle 节点
发表于 2009年06月4日 没有评论CyberArticle书籍内最重要的元素就是节点(ICANode)。无论是文件夹还是文章,都是一个节点。
节点的主要属性和方法
- ID:节点的ID。书籍内每一个节点都有一个唯一的ID。
- ParentID:节点的父节点ID。除了根节点,每一个节点,都有一个父节点。
- ParentNode:节点的父节点。除了根节点,每一个节点,都有一个父节点。
- Type:节点类型:0是文件夹,1是文章
- Pos:位置。在同一级别的节点位置,按照从小到大排序。
- DateCreated:创建时间
- Color:文字颜色
- BgColor:背景颜色
- IconIndex:图标索引。>=0,是系统图标;<0:自定义图标
- Title:标题
- Owner:节点所有者。就是创建节点的CyberArticle所在的计算机的名称。
- MoveTo:移动节点到另外一个节点。父节点,回收站不能移动。
- MoveToRecycleBin:移动节点到回收站。如果节点已经在回收站,则彻底删除。
- Delete:删除
- GetPrevSiblingNode:获得当前节点的前一个同级别节点。
- GetNextSiblingNode:获得当前节点的下一个同级别节点。
- Attribute:扩展属性。可以用来存储任何数据。属性名称长度最大为50个字符,属性值的最大长度为255个字符。
- Book:获得节点所在的书籍。
- Size:文章或者文件夹的大小。
- IsIn:可以判断一个节点是否在另外一个节点内。
文件夹独有的属性和方法
- Children:获得文件夹的子节点。
- FindChildNode:通过标题查找一个子节点。
文章独有的属性和方法
- DateModified, DateAccessed:最后一次修改,访问文章时间。
- Unread:文章是否未读
- FileType:文件类型。对于保存的网页,是.htm,对于导入的文件,则是.doc, .pdf等等,保存了文件的扩展名。
- Author:作者
- Keywords:关键字
- Label1, Label2, Label3, Label4, Label5:标签1-5
- URL:文章的网址,或者导入的文件原始路径
- Coments:注释
- Text:文章里面的文字。如果是网页,则保存的网页里面的文字内容。
- Article:获得文章对象(ICAArticle)。
- Attachments:文件附件。(ICAAttachmentCollection)
- InitArticle:设置文章内容。可以通过一个HTML字符串和一个网址,来初始化或者修改文章内容。
- AddAttachment:添加附件。
书籍内的重要节点
- 根节点。任何一个书籍都有一个根节点。在创建书籍的时候,系统会自动创建根节点。根节点的名称就是书籍的名称,根节点的ID为0。
- 回收站。任何一个书籍都有一个回收站。在创建书籍的时候,系统会自动创建回收站。回收站的ID为-1。
关于节点对象的详细定义,请参考开发人员手册。
书籍内创建节点,创建文件夹和文章,并且给文章设置内容。
下面是一个例子,用来打开每一个书籍,然后在根节点下面,查找 “I love CyberArticle” 这个文件夹。如果没有找到,则建立这个文件夹。然后在这个文件夹下面创建一个文章,并且用一段HTML文字来设置文章内容。
var objShell = new ActiveXObject(“WScript.Shell”);
function jsAlert(msg)
{
return objShell.Popup(msg, 10000, “CyberArticle”, 0);
}
var objBookCollection = new ActiveXObject(“CyberArticleBook.CABookCollection”);
for (var i = 0; i < objBookCollection.Count; i++)
{
var objBook = new ActiveXObject(“CyberArticleBook.CABook”); //创建ICABook对象
//
var guidBook = objBookCollection.GUID(i); //获得书籍的GUID
try
{
objBook.Open(guidBook); //打开书籍
}
catch (e)
{
continue;
}
//…
var nodeRoot = objBook.RootNode;
//
var nodeILoveCyberArticle = null;
try
{
nodeILoveCyberArticle = nodeRoot.FindChildNode(“I love CyberArticle”); //根节点下面查找文件夹
}
catch (e)
{
//如果找不到,会有一个异常,我们在这里捕获这个异常。
}
//
if (!nodeILoveCyberArticle || nodeILoveCyberArticle.Type != 0) //如果没有找到,后者不是文件夹
{
nodeILoveCyberArticle = objBook.CreateFolder(nodeRoot, “I love CyberArticle”); //创建一个新的文件夹
}
if (nodeILoveCyberArticle)
{
var nodeArticle = objBook.CreateArticle(nodeILoveCyberArticle, “My First SDK Article”);//创建文章
//文章html
var htmlText = “<html><head><title>My First SDK Article</title></head><body><h1>My First SDK Article</h1><p>Test text…</p><img src=http://www.wizbrother.com/screenshots/cyberarticle.png></img></body></html>”;
//创建一个profile
var objProfile = new ActiveXObject(“CyberArticleBook.CAProfile”);
objProfile.Name = “Test”;
objProfile.IncludeImages = true;
objProfile.DownloadItems = true;
//使用html文字设置文章内容
nodeArticle.InitArticle(htmlText, “”, objProfile);
}
//…
objBook.Close();
}从上面的例子可以看到如何通过书籍获得根节点,然后在节点下面查找文件夹,创建子文件夹和文章,并且用一段HTML文字来初始化文章。HTML里面可以用用图片等等资源,CyberArticle会自动将图片也保存到书籍中,就和在浏览器内保存网页是一样的效果。
结果如下图:

通过这种方式,如果定义好一个模板,只需要输入一些文字,然后格式化成HTML文件,保存到书籍里面,我们就可以非常容易的批量的生成大量格式相同的文章,例如公文等等。而且由于HTML本身的公开和易用,使得控制格式,也非常简单。如果用C#或者其它高级语言编写一个这样的程序,用于生成公文之类的文章,相信应该非常有用。同时利用CyberArticle WebShare组件,将文章发布出去,就是一个简单易用的文档生成和发布系统。
-
CyberArticle二次开发手册 – 3、CyberArticle 书籍
发表于 2009年06月3日 没有评论CyberArticle的资料,都保存在一个一个的书籍中。一个书籍,对应于一个数据库。CyberArticle的书籍,分为本地书籍和远程书籍。
- 本地书籍:使用桌面数据库系统,例如Access,SQL Server Express或者SQLite数据库。书籍的文件,保存在安装CyberArticle的电脑上面。每一个书籍,对应一个(Access/SQLite)或者多个书籍文件(SQL Server Express)。
- 远程书籍:使用大型数据库,例如SQL Server,MySQL数据库。数据保存在数据库服务器上面(当然也可以保存在本机)。
CyberArticle通过OLEDB方式连接这些数据库。同样,您也可以使用其它软件,例如各种数据库软件的管理工具,来打开相应的数据库。
CyberArticle通过ICABook对象,来封装了各种数据库的链接,打开和关闭等操作。使用ICABook,您不需要关心不同数据库之间的区别,甚至您根本不需要关心数据库。
ICABookCollection对象
CyberArticle把所有的书籍的一些数据库信息,都保存在Books.xml文件里面(数据库连接串被加密,以防用户名,密码等信息泄露)。同时,CyberArticle提供了ICABookCollection这个对象来访问这个文件。
下面的代码,创建了一个ICABookCollection对象,然后通过循环,显示了书籍列表里面,每一个书籍的名称。将下面的脚本保存成*.js文件,然后双击运行,就可以看到效果。
var objShell = new ActiveXObject(“WScript.Shell”);
function jsAlert(msg)
{
return objShell.Popup(msg, 10000, “CyberArticle”, 0);
}
var objBookCollection = new ActiveXObject(“CyberArticleBook.CABookCollection”); //ICABookCollection
for (var i = 0; i < objBookCollection.Count; i++)
{
var bookname = objBookCollection.BookName(i); //获得书籍名称
jsAlert(bookname);
}通过ICABookCollection对象,您可以获得每一个书籍的相关信息,例如GUID(用来标示每一个书籍),数据库连接串,书籍名称,书籍文件名(如果有的话),图标索引,分类等信息。
同时,通过ICABookCollection,你还可以添加书籍和删除书籍。具体功能,请参看开发人员手册。
ICABook对象
ICABook对象,提供了大量的属性和方法,主要有以下几类:
- 打开和关闭书籍
- 书籍属性,例如GUID,名称,图标索引
- 节点信息,例如获得根节点,回收站,创建文件夹,文章,获得某一个指定的节点,获得某一类节点等等
- 搜索书籍
- 获得书籍内其它的元素,例如附件,图标,标签等等
- 其它操作,例如压缩,备份等等
打开和关闭书籍
下面的代码,演示了如何打开书籍。通过循环,获得每一个书籍的GUID,然后调用ICABook对象的Open函数来打开书籍。如果无法打开,则显示一个对话框,提示不能打开某一个书籍。
var objShell = new ActiveXObject(“WScript.Shell”);
function jsAlert(msg)
{
return objShell.Popup(msg, 10000, “CyberArticle”, 0);
}
var objBookCollection = new ActiveXObject(“CyberArticleBook.CABookCollection”);
for (var i = 0; i < objBookCollection.Count; i++)
{
var objBook = new ActiveXObject(“CyberArticleBook.CABook”); //创建ICABook对象
var guidBook = objBookCollection.GUID(i); //获得书籍的GUID
try
{
objBook.Open(guidBook); //打开书籍
//…
objBook.Close();
}
catch (e)
{
var bookname = objBookCollection.BookName(i); //打开失败
jsAlert(“不能打开书籍:” + bookname);
}
}获得书籍属性
下面的代码,可以显示每一个书籍的名称:通过ICABook对象获得,而不是在Books.xml文件里面保存的书籍名称(ICABookCollection)。
var objShell = new ActiveXObject(“WScript.Shell”);
function jsAlert(msg)
{
return objShell.Popup(msg, 10000, “CyberArticle”, 0);
}
var objBookCollection = new ActiveXObject(“CyberArticleBook.CABookCollection”);
for (var i = 0; i < objBookCollection.Count; i++)
{
var objBook = new ActiveXObject(“CyberArticleBook.CABook”); //创建ICABook对象
var guidBook = objBookCollection.GUID(i); //获得书籍的GUID
try
{
objBook.Open(guidBook); //打开书籍
jsAlert(objBook.Name);
//…
objBook.Close();
}
catch (e)
{
var bookname = objBookCollection.BookName(i); //打开失败
jsAlert(“不能打开书籍:” + bookname);
}
}节点信息
下面的代码,显示了每一个书籍的节点数量,同时在每一个书籍的根节点下面,创建了一个叫做 “I love CyberArticle”的文件夹。
var objShell = new ActiveXObject(“WScript.Shell”);
function jsAlert(msg)
{
return objShell.Popup(msg, 10000, “CyberArticle”, 0);
}
var objBookCollection = new ActiveXObject(“CyberArticleBook.CABookCollection”);
for (var i = 0; i < objBookCollection.Count; i++)
{
var objBook = new ActiveXObject(“CyberArticleBook.CABook”); //创建ICABook对象
var guidBook = objBookCollection.GUID(i); //获得书籍的GUID
try
{
objBook.Open(guidBook); //打开书籍
//…
jsAlert(objBook.Nodes.Count);
var objNewNode = objBook.CreateFolder(objBook.RootNode, “I love CyberArticle”); //在书籍根节点下面,创建一个新的节点。
//…
objBook.Close();
}
catch (e)
{
var bookname = objBookCollection.BookName(i); //打开失败
jsAlert(“不能打开书籍:” + bookname);
}
}搜索书籍
下面的代码,在每一个书籍中,搜索”CyberArticle”,然后显示出搜索结果的一个节点标题(如果有的话):
var objShell = new ActiveXObject(“WScript.Shell”);
function jsAlert(msg)
{
return objShell.Popup(msg, 10000, “CyberArticle”, 0);
}
var objBookCollection = new ActiveXObject(“CyberArticleBook.CABookCollection”);
for (var i = 0; i < objBookCollection.Count; i++)
{
var objBook = new ActiveXObject(“CyberArticleBook.CABook”); //创建ICABook对象
var guidBook = objBookCollection.GUID(i); //获得书籍的GUID
try
{
objBook.Open(guidBook); //打开书籍
//…
var objResult = objBook.Search(“CyberArticle”, 1 + 2, 100); //搜索书籍
if (objResult && objResult.Count > 0) //如果搜索到
{
jsAlert(objResult.Item(0).Title); //显示第一个节点的标题
}
//…
objBook.Close();
}
catch (e)
{
var bookname = objBookCollection.BookName(i); //打开失败
jsAlert(“不能打开书籍:” + bookname);
}
}获得书籍其它元素信息
下面的代码,可以显示出,每一个书籍里面,附件的数量。如果有附件的话,显示第一个附件的名称。
var objShell = new ActiveXObject(“WScript.Shell”);
function jsAlert(msg)
{
return objShell.Popup(msg, 10000, “CyberArticle”, 0);
}
var objBookCollection = new ActiveXObject(“CyberArticleBook.CABookCollection”);
for (var i = 0; i < objBookCollection.Count; i++)
{
var objBook = new ActiveXObject(“CyberArticleBook.CABook”); //创建ICABook对象
var guidBook = objBookCollection.GUID(i); //获得书籍的GUID
try
{
objBook.Open(guidBook); //打开书籍
//…
var objAttachments = objBook.Attachments; //获得书籍内所有附件
if (objAttachments)
{
jsAlert(objAttachments.Count); //显示书籍数量
if (objAttachments.Count > 0)
{
jsAlert(objAttachments.Item(0).Name); //显示第一个附件的名称
}
}
//…
objBook.Close();
}
catch (e)
{
var bookname = objBookCollection.BookName(i); //打开失败
jsAlert(“不能打开书籍:” + bookname);
}
}压缩/备份书籍
下面的代码,可以压缩每一个书籍
var objShell = new ActiveXObject(“WScript.Shell”);
function jsAlert(msg)
{
return objShell.Popup(msg, 10000, “CyberArticle”, 0);
}
var objBookCollection = new ActiveXObject(“CyberArticleBook.CABookCollection”);
for (var i = 0; i < objBookCollection.Count; i++)
{
var objBook = new ActiveXObject(“CyberArticleBook.CABook”); //创建ICABook对象
var guidBook = objBookCollection.GUID(i); //获得书籍的GUID
try
{
objBook.Open(guidBook); //打开书籍
//…
objBook.Compress();
//…
objBook.Close();
}
catch (e)
{
var bookname = objBookCollection.BookName(i); //打开失败
jsAlert(“不能打开书籍:” + bookname);
}
}从上面的例子可以看出,只要获得了ICABook对象,您可以对书籍做任何操作。关于书籍的其它操作,请参考开发人员手册。
-
CyberArticle二次开发手册 – 2、CyberArticle COM对象
发表于 2009年06月3日 没有评论要对CyberArticle进行二次开发,主要的方式,就是通过调用COM对象,而二次开发的核心内容,也就是COM对象的使用。
CyberArticle的COM对象主要分为以下几类:
1、书籍和节点相关的对象
CyberArticle的数据,都保存在书籍中,而书籍里面的基本元素就是节点。
- 书籍:ICABook
- 节点:ICANode
- 文章:ICAArticle
通过ICABook,可以打开,关闭一个书籍,或者获得书籍里面的节点等信息。
ICANode是书籍里面的节点。文件夹,文章,统一称为节点。无论是文件夹,还是文章,都是一个节点。通过ICANode的相关信息,可以获得节点的信息,例如类型,标题等等。
ICAArticle则是文章节点所包含的文章数据对象。通过ICAArticle,可以将文章保存成HTML文件,或者更新一个文章等等。通过ICANode可以获得ICAArticle。
其他相关对象:
- ICALabel:标签
- ICAAttachment:附件
- ICAArticleResource:文章资源。CyberArticle文章是一个HTML文件。HTML文件不但有HTML代码本身,还包括里面引用的CSS,图片,Flash等等资源。
- ICAProfile:用来保存文章的配置文件,可以设置是否包含图片,包含脚本等等。
- ICABookmark:书签。一个书签可以代表一个书签文件夹或者一篇文章
- ICAIcon:图标。书籍内的自定义图标。
- ICACommand:保存网页的命令。
- ICADatabase:CyberArticle数据库对象
- ICADBError:CyberArticle数据库操作错误对象
- ICANodeHistory:结点历史纪录对象
2、集合对象
通常节点,书籍等等,都可能需要一个类似数组的集合,例如获得一个文件夹下面的文章,就需要一个集合。CyberArticle里面,对象的集合,都是ICAXXXCollection这样的对象。
- ICABookCollection:书籍集合
- ICANodeCollection:节点集合
- ICALabelCollection:标签集合
- ICAAttachmentCollection:附件集合
- ICAArticleResourceCollection:文章资源集合
- ICAProfileCollection:配置文件集合
- ICABookmarkCollection:书签集合
- ICAIconCollection:图标集合
- ICANodeHistoryCollection:节点历史数据集合
每一个Collection对象,都至少具有以下两个属性:
[propget, id(1), helpstring("property Count")] HRESULT Count([out, retval] LONG* pVal);
[propget, id(2), helpstring("property Item")] HRESULT Item([in] LONG nIndex, [out, retval] IDispatch** pVal);- 属性Count:返回集合的元素数量。
- 属性Item:获得某一个元素。
下面是一个使用的例子:
C++ 例子
ICANodeCollection* pNodeCollection(pDisp);
//
long nCount = 0;
pNodeCollection->get_Count(&nCount);//获得节点数量
//
for (long i = 0; i < nCount; i++)
{
CComPtr<IDispatch> spDispNode = NULL;
if (FAILED(pNodeCollection->get_Item(i, &spDispNode)))//获得一个节点
continue;
//
CComQIPtr<ICANode> spNode(spNodeDisp);//转换为ICANode
//
CComBSTR bstrTitle;
spNode->get_Title(&bstrTitle);//获得标题
AfxMessageBox(CString(bstrTitle));//显示标题
}VBScript 例子
For i = 0 To objNodeCollection.Count - 1 Step 1
Dim objNode
Set objNode = objNodeCollection.item(i)
MsgBox(objNode.Title)
NextJavaScript例子
objBook.Open(guidBook);
var childNodes = objBook.RootNode.Children;
for (var i = 0; i < childNodes.Count; i++)
{
jsAlert(childNodes.Item(i).Title);
}3、UI相关对象
- ICABookTools:书籍工具,可以显示创建/打开书籍对话框等等
- ICACommonUI:通用UI,可以显示书籍,节点属性等对话框。
- ICAHelper:可以用来在IE里面保存网页,并显示保存网页对话框
- ICAContextMenu:IE右键菜单
- ICAToolButton:IE工具栏按钮
- ICAImportHTML,ICAImportHTMLData,ICAImportHTMLDataCollection:用来批量导入文件
4、CyberArticle用户交互
- ICAAutomationApp:可以获得正在正在运行的CyberArticle的一些相关信息,例如用户正在打开的文章,选中的节点等等。
5、BookBuilder批量下载保存网页
- ICABookBuilderAutomationApp:可以调用BookBuilder,批量下载网页。
6、通用对象,和CyberArticle没有关系,可以在任何地方使用
- IWizBubbleWnd:一个消息框,通常用来显示一个信息。如果用户没有操作,一段时间后,自动消失
- IWizURLDownloader:可以用来下载文件并获得下载后的文件
- IWizProgressWnd:一个进度对话框
- IWizRtf2Html:RTF2HTML,将RTF转换为HTML
- IWizMessageBoxWnd:一个消息对话框,可以显示“不再提示”复选框。
- IWizCommonUI:可以显示一些常用的对话框,例如输入文字对话框等等。
- IWizMimeMessage:用来打开,保存,转换mime文件的工具。
以上这些,就是CyberArticle公开的COM对象。这些COM对象,全部都可以通过脚本语言(JsvaScript/VBScript),高级语言(C/C++/Delphi),.NET语言(C#/VB.NET)等等调用,只要这些语言支持COM自动化技术即可。
CyberArticle,也可以看作一个Shell程序,通过调用这些对象,来实现某些特定的功能。
-
CyberArticle二次开发手册 – 1、前言
发表于 2009年06月2日 没有评论CyberArticle具有超强的二次开发能力,在这里,我将会不定期的写一些文章,来介绍如何利用CyberArticle进行一些二次开发。
为什么要对CyberArticle做二次开发?
如果您是开发人员,或者您具有一定的开发能力,在您使用CyberArticle的时候,可能会有一些不能满足您的需求的地方;或者您希望将CyberArticle的某些功能加入您的软件;或者您希望开发CyberArticle的其它功能,提供给其它用户使用,甚至对这个功能进行收费等等,您都可以对CyberArticle进行二次开发。
利用CyberArticle接口,可以完成什么功能?
- 更容易的开发一个更好的CyberArticle:CyberArticle保存网页,存储数据,管理数据等等功能,都通过COM自动化方式提供接口。CyberArticle主程序,也是通过调用这些接口来实现各种功能的。因此,理论上,利用这些接口,您完全可以更容易的编写另外一个CyberArticle。
- 编写CyberArticle插件。CyberArticle各种节点管理功能,都是通过插件来实现的,例如移动/复制节点,排序,合并,批量重命名,发布文章到Blog,书籍同步,编辑文章里面的插入连接,源代码着色,批量插入图片等等功能,全部都是通过插件来实现的。因此,您完全可以写一些功能更强的CyberArticle插件,来实现更多的功能。
- 编写CyberArticle宏。通过CyberArticle宏,同样可以扩展CyberArticle功能,例如保存为模板,标记文字,就是通过CyberArticle宏来实现的。
- 提供工具,例如转换MyBase数据到CyberArticle,就是通过C#编写的一个小工具,调用CyberArticle功能来实现的。
- 整合某些功能到您的软件。您可以利用CyberArticle提供的某些功能,例如Mime文件转换为html等等,来增强您的软件。
- 处理书籍文章。可以通过插件,来编写HTML处理程序,批量处理保存后的文章,例如去处广告等等
- 导入其它格式文件,例如导入pdf文件
- 导出其它格式文件,例如经过处理的html等等
- 发布资料。CyberArticle WebShare就是利用C#编写的一个通过iis发布文章的程序。
- 其它更多功能
技术准备
以下具备其一就可以了:
- 熟悉VBScript或者JavaScript
- 熟悉C/C++或者Delphi或者其它高级语言
- 熟悉C#或者VB.net或者其他.NET语言
熟悉VBScript或者JavaScript,您就可以开发CyberArticle宏,或者写一段自动化脚本,来完成一些特定的功能。
熟悉C/C++或者Delphi,您就可以开发CyberArticle插件,使您的插件运行在CyberArticle内部(同一进程),还可以在CyberArticle里面加入您的菜单。当然,您也可以编写独立进程的程序,通过COM/自动化方式,调用CyberArticle。
熟悉C#/VB.net等语言,您可以通过COM自动化技术,来调用CyberArticle提供的接口,来实现各种功能扩展。
软件准备
- CyberArticle 5.3或者更高的版本
- 相关开发工具,例如记事本,Visual Studio,Delphi等等。
- CyberArticle开发人员手册。里面包含了CyberArticle的接口定义,还有一些插件/宏例子。下载



最近评论