<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>老魏的博客, Wiz, CyberArticle作者官方网站 &#187; CyberArticle二次开发手册</title>
	<atom:link href="http://weishijun.com/p/category/cyberarticle-dev/feed" rel="self" type="application/rss+xml" />
	<link>http://weishijun.com</link>
	<description>Wiz, CyberArticle开发手记</description>
	<lastBuildDate>Sat, 08 Jan 2011 12:16:39 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>CyberArticle二次开发手册 &#8211; 5、CyberArticle 文章</title>
		<link>http://weishijun.com/p/388</link>
		<comments>http://weishijun.com/p/388#comments</comments>
		<pubDate>Thu, 04 Jun 2009 14:31:52 +0000</pubDate>
		<dc:creator>魏 拾俊</dc:creator>
				<category><![CDATA[CyberArticle二次开发手册]]></category>

		<guid isPermaLink="false">http://weishijun.com/p/388</guid>
		<description><![CDATA[每一个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(&#8220;WScript.Shell&#8221;);function jsAlert(msg){&#160;&#160;&#160;&#160;return objShell.Popup(msg, 10000, &#8220;CyberArticle&#8221;, 0);}function Test(){&#160;&#160;&#160;&#160;var objBookCollection = new ActiveXObject(&#8220;CyberArticleBook.CABookCollection&#8221;);&#160;&#160;&#160;&#160;for (var i = 0; i &#60; objBookCollection.Count; i++)&#160;&#160;&#160;&#160;{&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;var objBook = new ActiveXObject(&#8220;CyberArticleBook.CABook&#8221;); //创建ICABook对象&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;//&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;var guidBook = objBookCollection.GUID(i);&#160;&#160;&#160;//获得书籍的GUID&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;try&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;{&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;objBook.Open(guidBook); //打开书籍&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;catch (e)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;{&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;continue;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;//&#8230;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;var nodeRoot = objBook.RootNode;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;//&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;var nodeArticle = objBook.CreateArticle(nodeRoot, &#8220;My Article&#8221;); //创建文章&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;//文章html&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;var htmlText = &#8220;&#60;html&#62;&#60;head&#62;&#60;title&#62;My First SDK Article&#60;/title&#62;&#60;/head&#62;&#60;body&#62;&#60;h1&#62;My First SDK Article&#60;/h1&#62;&#60;p&#62;Test text&#8230;&#60;/p&#62;&#60;img src=http://www.wizbrother.com/screenshots/cyberarticle.png&#62;&#60;/img&#62;&#60;/body&#62;&#60;/html&#62;&#8221;;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;//创建一个profile&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;var objProfile = [...]]]></description>
		<wfw:commentRss>http://weishijun.com/p/388/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CyberArticle二次开发手册 &#8211; 4、CyberArticle 节点</title>
		<link>http://weishijun.com/p/385</link>
		<comments>http://weishijun.com/p/385#comments</comments>
		<pubDate>Thu, 04 Jun 2009 11:11:02 +0000</pubDate>
		<dc:creator>魏 拾俊</dc:creator>
				<category><![CDATA[CyberArticle二次开发手册]]></category>

		<guid isPermaLink="false">http://weishijun.com/p/385</guid>
		<description><![CDATA[CyberArticle书籍内最重要的元素就是节点(ICANode)。无论是文件夹还是文章，都是一个节点。
节点的主要属性和方法

ID：节点的ID。书籍内每一个节点都有一个唯一的ID。
ParentID：节点的父节点ID。除了根节点，每一个节点，都有一个父节点。
ParentNode：节点的父节点。除了根节点，每一个节点，都有一个父节点。
Type：节点类型：0是文件夹，1是文章
Pos：位置。在同一级别的节点位置，按照从小到大排序。
DateCreated：创建时间
Color：文字颜色
BgColor：背景颜色
IconIndex：图标索引。&#62;=0，是系统图标；&#60;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。

关于节点对象的详细定义，请参考开发人员手册。
书籍内创建节点，创建文件夹和文章，并且给文章设置内容。
下面是一个例子，用来打开每一个书籍，然后在根节点下面，查找 &#8220;I love CyberArticle&#8221; 这个文件夹。如果没有找到，则建立这个文件夹。然后在这个文件夹下面创建一个文章，并且用一段HTML文字来设置文章内容。
var objShell = new ActiveXObject(&#8220;WScript.Shell&#8221;);function jsAlert(msg){&#160;&#160;&#160;&#160;return objShell.Popup(msg, 10000, &#8220;CyberArticle&#8221;, 0);}var objBookCollection = new ActiveXObject(&#8220;CyberArticleBook.CABookCollection&#8221;);for (var i = 0; i &#60; objBookCollection.Count; i++){&#160;&#160;&#160;&#160;var objBook = new ActiveXObject(&#8220;CyberArticleBook.CABook&#8221;); //创建ICABook对象&#160;&#160;&#160;&#160;//&#160;&#160;&#160;&#160;var guidBook = objBookCollection.GUID(i);&#160;&#160;&#160;//获得书籍的GUID&#160;&#160;&#160;&#160;try&#160;&#160;&#160;&#160;{&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;objBook.Open(guidBook); //打开书籍&#160;&#160;&#160;&#160;}&#160;&#160;&#160;&#160;catch (e)&#160;&#160;&#160;&#160;{&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;continue;&#160;&#160;&#160;&#160;}&#160;&#160;&#160;&#160;//&#8230;&#160;&#160;&#160;&#160;var nodeRoot = objBook.RootNode;&#160;&#160;&#160;&#160;//&#160;&#160;&#160;&#160;var nodeILoveCyberArticle = null;&#160;&#160;&#160;&#160;try&#160;&#160;&#160;&#160;{&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;nodeILoveCyberArticle = nodeRoot.FindChildNode(&#8220;I love CyberArticle&#8221;);&#160;&#160;//根节点下面查找文件夹&#160;&#160;&#160;&#160;}&#160;&#160;&#160;&#160;catch (e)&#160;&#160;&#160;&#160;{&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;//如果找不到，会有一个异常，我们在这里捕获这个异常。&#160;&#160;&#160;&#160;}&#160;&#160;&#160;&#160;//&#160;&#160;&#160;&#160;if (!nodeILoveCyberArticle &#124;&#124; [...]]]></description>
		<wfw:commentRss>http://weishijun.com/p/385/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CyberArticle二次开发手册 &#8211; 3、CyberArticle 书籍</title>
		<link>http://weishijun.com/p/377</link>
		<comments>http://weishijun.com/p/377#comments</comments>
		<pubDate>Wed, 03 Jun 2009 15:18:12 +0000</pubDate>
		<dc:creator>魏 拾俊</dc:creator>
				<category><![CDATA[CyberArticle二次开发手册]]></category>

		<guid isPermaLink="false">http://weishijun.com/p/377</guid>
		<description><![CDATA[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(&#8220;WScript.Shell&#8221;);function jsAlert(msg){&#160;&#160;&#160;&#160;return objShell.Popup(msg, 10000, &#8220;CyberArticle&#8221;, 0);}var objBookCollection = new ActiveXObject(&#8220;CyberArticleBook.CABookCollection&#8221;);&#160;&#160;&#160;&#160;//ICABookCollectionfor (var i = 0; i &#60; objBookCollection.Count; i++){&#160;&#160;&#160;&#160;var bookname = objBookCollection.BookName(i);&#160;&#160;&#160;&#160;//获得书籍名称&#160;&#160;&#160;&#160;jsAlert(bookname);}
通过ICABookCollection对象，您可以获得每一个书籍的相关信息，例如GUID（用来标示每一个书籍），数据库连接串，书籍名称，书籍文件名（如果有的话），图标索引，分类等信息。
同时，通过ICABookCollection，你还可以添加书籍和删除书籍。具体功能，请参看开发人员手册。
ICABook对象
ICABook对象，提供了大量的属性和方法，主要有以下几类：

打开和关闭书籍
书籍属性，例如GUID，名称，图标索引
节点信息，例如获得根节点，回收站，创建文件夹，文章，获得某一个指定的节点，获得某一类节点等等
搜索书籍
获得书籍内其它的元素，例如附件，图标，标签等等
其它操作，例如压缩，备份等等

打开和关闭书籍
下面的代码，演示了如何打开书籍。通过循环，获得每一个书籍的GUID，然后调用ICABook对象的Open函数来打开书籍。如果无法打开，则显示一个对话框，提示不能打开某一个书籍。
var objShell = new ActiveXObject(&#8220;WScript.Shell&#8221;);function jsAlert(msg){&#160;&#160;&#160;&#160;return objShell.Popup(msg, 10000, &#8220;CyberArticle&#8221;, 0);}var objBookCollection = new ActiveXObject(&#8220;CyberArticleBook.CABookCollection&#8221;);for (var i = 0; i &#60; [...]]]></description>
		<wfw:commentRss>http://weishijun.com/p/377/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CyberArticle二次开发手册 &#8211; 2、CyberArticle COM对象</title>
		<link>http://weishijun.com/p/375</link>
		<comments>http://weishijun.com/p/375#comments</comments>
		<pubDate>Wed, 03 Jun 2009 14:03:01 +0000</pubDate>
		<dc:creator>魏 拾俊</dc:creator>
				<category><![CDATA[CyberArticle二次开发手册]]></category>

		<guid isPermaLink="false">http://weishijun.com/p/375</guid>
		<description><![CDATA[要对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对象，都至少具有以下两个属性：
&#160;&#160;&#160;&#160;[propget, id(1), helpstring("property Count")] HRESULT Count([out, retval] LONG* pVal);&#160;&#160;&#160;&#160;&#160;[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-&#62;get_Count(&#38;nCount);//获得节点数量//for (long i = 0; i &#60; nCount; i++){&#160;&#160;&#160;&#160;CComPtr&#60;IDispatch&#62; spDispNode = NULL;&#160;&#160;&#160;&#160;if (FAILED(pNodeCollection-&#62;get_Item(i, &#38;spDispNode)))//获得一个节点&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;continue;&#160;&#160;&#160;&#160;//&#160;&#160;&#160;&#160;CComQIPtr&#60;ICANode&#62; spNode(spNodeDisp);//转换为ICANode&#160;&#160;&#160;&#160;//&#160;&#160;&#160;&#160;CComBSTR bstrTitle;&#160;&#160;&#160;&#160;spNode-&#62;get_Title(&#38;bstrTitle);//获得标题&#160;&#160;&#160;&#160;AfxMessageBox(CString(bstrTitle));//显示标题}
VBScript 例子
For i = 0 To objNodeCollection.Count - 1 Step 1&#160;&#160;&#160;&#160;Dim objNode&#160;&#160;&#160;&#160;Set objNode = objNodeCollection.item(i)&#160;&#160;&#160;&#160;MsgBox(objNode.Title)Next
JavaScript例子
objBook.Open(guidBook);var [...]]]></description>
		<wfw:commentRss>http://weishijun.com/p/375/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CyberArticle二次开发手册 &#8211; 1、前言</title>
		<link>http://weishijun.com/p/370</link>
		<comments>http://weishijun.com/p/370#comments</comments>
		<pubDate>Tue, 02 Jun 2009 13:31:36 +0000</pubDate>
		<dc:creator>魏 拾俊</dc:creator>
				<category><![CDATA[CyberArticle二次开发手册]]></category>

		<guid isPermaLink="false">http://weishijun.com/p/370</guid>
		<description><![CDATA[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的接口定义，还有一些插件/宏例子。下载

]]></description>
		<wfw:commentRss>http://weishijun.com/p/370/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

