您的位置:首页 > 编程语言 > C#

C#生成CHM文件(中级篇)

2011-10-08 09:18 225 查看
在上篇《C#生成CHM文件(入门篇)》中,我们利用微软自带的hhc.exe以编程的方式创建一个CHM文件,而且调用的是一个静态的HMTL文件。

在中篇中,实现以下几个目标
1.将在线的网页保存为CHM文件
2.我们将对我们进行编译的CHM文件进行反编译,使用的还是微软自带的一个exe(hh.exe)。
3.以编程的方式将CHM文件转换为Word

在中篇中,把界面稍微调整了下,如下图

代码

/// <summary>
/// feedback about processing
/// </summary>
public event EventHandler<ProcessFileEventArgs> ProcessFileIntoWord;//定义一个事件属性
private WordClass withEventsField_w = new WordClass();
/// <summary>
/// 通过这个类,我们可以转换为word,并且把事件传给调用者
/// </summary>
public WordClass w
{
get { return withEventsField_w; }
set
{
if (withEventsField_w != null)//如果不为null,撤销事件
{
withEventsField_w.ProcessFile -= w_ProcessFile;
}
withEventsField_w = value;
if (withEventsField_w != null)//如果不为null,注册
{
withEventsField_w.ProcessFile += w_ProcessFile;
}
}
}
/// <summary>
/// 主要函数:反编译、导出
/// </summary>
/// <param name="ChmFile">待反编译的CHM文件</param>
/// <param name="DocFile">word文件名</param>
/// <remarks>word文件一定不存在</remarks>
public void DecompileAndExport(string ChmFile, string DocFile)
{
try
{
Decompile d = new Decompile();//实例化一个反编译类
string strHHC = d.DecompileChm(ChmFile);//获取hhc文件
w.AddToWord(strHHC, DocFile);//调用word类的添加到word中方法
}
catch (System.Runtime.InteropServices.COMException ex)
{
//throw new clsError("Com exception:" + ex.Message, ErrorsOcurred.ComError);
}

}

我利用刚刚生成的baidu的CHM导出的word如图:



效果还是不错的,呵呵。如果你的CHM文件大的话,导出的时间可能会比较长一些。

PS:
1.如果你使用的是office2003或者office2007,需要修改类库项目下的WordClass类下Word方法,因为office2010的
Microsoft.Office.Interop.Word.ApplicationClass不再提供构造方法,而是提供Microsoft.Office.Interop.Word.Application()接口

2.如果在转换的工程中,始终没有反应,可以调试下,如果出现这样的错误,“因为没有打开的文档,所以这一命令无效”。

调试中不会弹出异常,但是将鼠标放到wApp对象中,查看的会发现那样的错误,原因是因为权限不够,可以采用如下方法解决:

运行dcomcnfg打开组件服务,依次展开"组件服务"->"计算机"->"我的电脑"->"DCOM配置"

找到"Microsoft Word应用程序",右键打开属性对话框,
点击"标识"选项卡,点击"标识"标签,选择"交互式用户"(此设置可能对计算机安全存在威胁,如不设置可以解决问题就不设置,点"下列用户",把管理员的用户administrator密码....正确填写进去也行)
点击"安全"选项卡,依次把"启动和激活权限","访问权限","配置权限",都选择为自定义,然后依次点击它们的编辑,把everyone添加进去,并加入所有的权限...
OK,解决此问题!
如果你的office是2010或者你的系统版本较高的话,很有可能遇到这样的问题。我的电脑是windows7+office2010,就遇到了这样的问题。

3.在反编译和在线生成CHM的时候会生成一些临时文件,如果不及时删掉的话,会造成空间的浪费。我们自己可以写一个简单的删除程序,这个应该很简单,如果不会的,可以参考我以前项目中的代码,/article/4705500.html

PS:汗...(2010-09-30 12:40),忘了附源代码了 C#生成CHM(中级篇)

在下篇(应用篇)中,我将说说如何将这些技术运用到实际中。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: