ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 59459|回复: 76

ExcelDna项目:如何封装和保护Excel文件里面的公式及VBA代码,防止被抄袭和非授权外流

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2012-12-30 13:21 | 显示全部楼层 |阅读模式
本帖已被收录到知识树中,索引项:插件开发
本帖最后由 liucqa 于 2018-5-3 23:02 编辑

        通常来说,在Excel开发方面,很多人都有着保护劳动成果不被他人随意修改和任意流传的需求。无论这种需求是出于对数据结果正确性的考虑,还是出于对知识产权保护的考虑,我们都需要找到一种方便易用,开发迅速的简便方法。
   
        对大多数普通群众来说,能否保护工作表中的公式不被使用者看到,是一个令人挠头的问题。
        而对VBA开发者来说,从VBA出现的那天起,如何保护VBA代码就更是一个永恒的话题。

目前我们已知的方法:        
保护工作表公式
1、简单的办法是设置工作表密码--------很容易破解
2、使用VBA替代--------只能保护数据的正确性,依然面临代码暴露问题

保护VBA代码
1、共享工作簿或者设置工程密码--------很容易破解
2、使用宏表-------面临代码暴露问题
3、使用Excel95------不推荐,后继开发问题太多
4、代码混淆(例如VBASafe)------意义不大
5、利用Excel bug使设置了工程密码的VBA代码不可见,有相应工具---------不过这种保护是可逆的
6、阿吉的几种方法,参见http://forum.twbts.com/thread-51-1-1.html(可能要 翻 墙 看),这个帖子系统讲解了Excel的各种保护技巧,值得学习。其中的复合文档模块隐藏方法(可以用UltraEdit简单操作实现)比较有价值,不过不利于代码的后期维护。同时也很容易被某工具直接提取出VBA代码。
例子参见:http://club.excelhome.net/thread-968072-1-1.html

7、使用工具加壳打包为Exe文件--------存在临时文件释放问题,使用文件监视器即可轻易破解

从目前实践的情况来看,如果要同时考虑代码安全和后期维护问题,上述几种方法都不可取。

因此,采用DLL、XLL封装就成了保护Excel文件中的公式和代码不被暴露的唯一选择,也是可长期持续发展的选择。我推荐有一定.Net基础的人采用XLL方式开发,最大的好处是不需要安装包!分发问题解决了!!
另一个问题在于:我们要找到一种类似VBA开发快捷程度的快速开发的工具,这样才能利用简单的知识快捷开发和封装文件。

本文不对如何封装的具体代码进行讨论,那样要写厚厚的一本书才行。
本文会推荐论坛中的一些帖子,以及接合本人在开发中的一些实际经验,来与大家交流封装技术。

欢迎大家参与讨论,互相学习


讨论的内容分三个部分:
1、VB 6.0的DLL封装
2、VSTO开发(程序级、文档级、加载宏)
3、.Net下的XLL开发(Excel-DNA项目)


******************************************************************************

俺认为,要想保护你在工作表之中的函数公式不被公开,开发成本最低,操作也最简单的唯一办法是:
在XLL文件中封装你在公式中用到的工作表函数,以及你的公式计算过程。
原理看10楼介绍


******************************

开发office应用的难易程度:

易     -------------------------------------------------------------------------------------->        难
VBA      .DNA(txt)       DNA(VS C#/VB)       VSTO(VB/C#)      VB(dll)     C++(dll / xll)

所以我觉得Excel DNA项目还是很有前途的。对付普通的VBA应用基本没问题了,不过还是需要使用者有C#基础(最好懂一点C API)
ExcelDna项目完整工程演示及讲解
http://www.cnblogs.com/Charltsing/p/ExcelDnaDemo.html




评分

9

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-12-30 13:22 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 liucqa 于 2012-12-31 23:06 编辑

VB 6.0的DLL封装

先给新手解释几个问题:

1、什么是封装:
一言以蔽之,封装就是用高级编程语言(VB、C、C++、.net等)重新写代码,以达成VBA相同的功能,并确保能够被Excel直接使用。

2、封装一定要使用DLL方式吗?
不一定,VBA除了可以像调用API一样调用自己开发的DLL中的函数外,还可以使用Com加载宏,或者调用外部COM对象(使用CreatObject)。
另外,Excel本身也能够调用XLL,或者直接使用VSTO开发的应用。

3、为什么要封装:
为了保护代码和公式。因为采用第三方工具编写的代码,在生成DLL、COM、XLL之后,代码是加密的,除了专业人士很难破解(.net开发的dll例外,需要混淆后再加壳打包)。对于保护我们自己的应用功能来说,这种程度的加密,已经完全足够了。

下面是论坛的一些帖子,系统的讲解了如何使用VB 6.0做DLL封装
[/url][url=http://club.excelhome.net/thread-965305-1-1.html]简述封装VBA自定义函数dll以及在VBA和工作表中的引用
COM加载宏封装自定义函数并全自动安装最简实例
一步步教你制作、使用dll(1)
[原创]VBA 全自动使用DLL 的各种封装方法 - 完全公开源码和方法(如用VSTO就什么都不用学)
【宏通Excel_VBA Com加载宏制作通用模板】、Dll
VBA封装为Dll的例子、方法与总结【逐步完善中...】
注册、反注册dll,regsvr32命令详解

关于VB6.0的封装,论坛已经有很多帖子,本文不再涉及。

无论是使用C、C++、VB6.0哪一个语言来开发DLL,VBA开发者都要学习很多新的知识,容易望而生畏。此外,采用DLL开发Ribbon菜单的难度较大,因此微软不推荐使用这种方法来代替VBA开发。

如果您想从VBA转入专业Excel应用开发的话,建议使用VSTO或者XLL。




TA的精华主题

TA的得分主题

 楼主| 发表于 2012-12-30 13:23 | 显示全部楼层
本帖最后由 liucqa 于 2012-12-31 15:05 编辑

VSTO 开发

1、先解释一下什么是VSTO
VSTO:Microsoft Visual Studio Tools for the Microsoft Office System。是一个在Visual Studio下开发Office应用的工具。需要安装VS2005、2008、2010等环境

2、什么是Office 主互操作程序集 Microsoft Office PIAs
PIAs:Office Primary Interop Assemblies是用来使应用程序能够访问Office功能的一个程序集,包括
Microsoft.Office.Interop.Excel.dll
Microsoft.Office.Interop.Outlook.dll
Microsoft.Office.Interop.PowerPoint.dll
Microsoft.Office.Interop.Word.dll
等等
开发VSTO应用,需要用到这个程序集。

3、VSTO可以开发哪些应用
如果你安装了VS2010,可以开发程序级别、文档级别和外接加载宏应用
1.JPG

推荐在VS2010+.Net 4.0环境下开发,具体原因不在这里细说。

http://club.excelhome.net/thread-946156-1-2.html  文档级别的例子
http://club.excelhome.net/thread-945014-1-1.html  加载项的例子


从实践的情况来看,通过VSTO开发Excel应用,具有功能强大,部署方便的特点。
但其劣势也很明显:普通使用者无力学习如此复杂的开发环境及开发语言,这直接造成了VSTO推广困难,只能在专业的程序员和企业内部中大型开发中得到应用。

能不能找到一种方便个人开发者使用的简便工具呢:
我把目光转向了XLL加载宏。早期的XLL加载宏只能使用C++来开发,难度大。自从Excel-DNA项目发布0.3版之后,我终于找到了一个可以快速开发XLL加载宏的工具。



TA的精华主题

TA的得分主题

 楼主| 发表于 2012-12-30 13:24 | 显示全部楼层
本帖最后由 liucqa 于 2012-12-30 15:53 编辑

开发XLL加载宏

1、什么是XLL加载宏?
XLL加载宏其实就是一种特殊的DLL,在这个DLL中,实现了 xlAutoFree,  xlAutoAdd,  xlAutoOpen,  xlAutoClose,  xlAutoRemove,  xlAutoRegister,  xlAddInManagerInfo等一些函数,以便Excel可以识别,并加载。由于XLL就是DLL的一个特例,因此具备相当强度的保密性(XLA加载宏是没有代码保密功能的)。

2、XLL加载宏能做什么?
几乎可以完成VSTO所能完成的全部工作,但是由于不具备VS开发环境里面的Ribbon图形化设计功能,如果需要做界面的话,需要事先设计XML文本,并通晓一些回调的知识。

3、XLL加载宏如何加载和管理?
可以使用Excel打开,或者用VBA代码加载,甚至也可以用一个XLL加载另一个XLL(可以实现自动Update功能)。注销也可以通过Excel、VBA、或者代码实现

4、如何开发XLL加载宏?

早期通过C/C++语言开发,具体见下帖
http://blog.csdn.net/wxy6285/article/details/3255673

由于使用C++开发困难较大,不适合VBA开发者,因此,我建议通过Excel-DNA项目来完成XLL的开发。


TA的精华主题

TA的得分主题

 楼主| 发表于 2012-12-30 13:24 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 liucqa 于 2012-12-30 15:53 编辑

Excel-DNA介绍,第一个例子

1、什么是Excel-DNA
这是一个开源项目,可以使用户方便的通过.Net语言来开发XLL加载宏。
开发方式分为两种,可以直接通过编辑.dna文件来快速开发,也可以通过VS2010工程来进行DLL开发。两个方式最终都可以打包成为XLL,但只有后者提供代码安全性。如果需要彻底的保护文件的话,还需要使用签名工具给打包之后的XLL文件做上数字签名以保证文件不会被篡改。

官方网址:http://excel-dna.net/
最新版本是0.30---------2012年12月13日发布,下载网址http://exceldna.codeplex.com/releases/view/95861

2、一个使用dna文件来运行XLL加载宏的例子
第一步,在示例中找到.dna文件,并用记事本写入函数。例子里面已经写好了。
3.JPG

第二步,双击运行ExcelDna.xll文件,这个文件会自动调用.dna文件中的函数,加载到Excel里面(如果是64位的机器,双击运行ExcelDna64.xll)
2.JPG

第三步,在工作表中使用这个函数
1.JPG

从使用过程中,可以看到通过dna文件来建立XLL加载宏中的自定义函数,操作非常的简便。省去了用C++开发的一大堆代码。ExcelDna.xll会替你做这些工作。
在.dna文件中编辑函数的方法,与VBA开发者习惯的操作没什么不同,只不过不能调试而已。如果代码不复杂的话,完全可以直接在dna文件中书写。

开发速度快,是采用ExcelDna的最重要理由。

第一个例子.rar (322.79 KB, 下载次数: 686)

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-12-30 13:25 | 显示全部楼层
本帖最后由 liucqa 于 2012-12-30 16:09 编辑

第二个例子:使用Excel-DNA开发XLL加载宏---Ribbon

1、什么是Ribbon
Ribbon是新的 Microsoft Office Fluent 用户界面 (UI) 的一部分,从Office2007开始支持。嗯,就是Excel最上面那个有着一大堆图标和文字的面板

2、如何开发Ribbon
开发Ribbon是一件比较麻烦的工作,网上有篇文章叫做“细品Ribbon功能区”,网址http://www.excelperfect.com/index.php/2009/04/28/ribbonxstudy6/,不了解Ribbon的人可以仔细看看。
对大部分人来说,开发Ribbon是一件心有余而力不足的事情,想在XLL里面开发Ribbon就更加遥不可及了。
理论上说,开发Ribbon的最佳工具是VSTO,因为其具备可视化的设计界面。但由于此工具不适合VBA的普通开发者,因此我建议还是通过某种方式得到用来设计Ribbon的XML代码,并通过Excel-DNA加入到你的XLL宏中。

具体例子:
2.JPG

安装之后的界面
1.JPG

Ribbon例子.rar (325.7 KB, 下载次数: 347)

开发Ribbon是一件麻烦事,建议通过专业人士进行。普通的VBA开发者只要会抄代码就可以了{:soso_e113:}


TA的精华主题

TA的得分主题

 楼主| 发表于 2012-12-30 13:26 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 liucqa 于 2012-12-30 16:22 编辑

第三个例子:使用Excel-DNA开发XLL加载宏---操作Excel

我们可以使用Excel-DNA的文件来生成加载宏和自定义函数,亦能操作Excel表格,完成VBA所能完成的大部分功能。

代码及例子
1、dna文件中的代码
1.JPG

2、运行ExcelDna.xll之后的效果
2.JPG

3、运行dna文件里面的函数
3.JPG


示例文件:
加载宏及操作Excel.rar (323.12 KB, 下载次数: 360)

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-12-30 13:27 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 liucqa 于 2014-9-30 08:12 编辑

使用Excel-DNA开发XLL加载宏---打包.dna文件到XLL

嗯,为什么要打包呢?
目的是为了部署方便,你不能给使用者好多个文件去运行。打包成一个XLL文件就方便多了。

文档中的说明:
4.JPG

Excel-DNA - Step-by-step C# add-in.rar (419.03 KB, 下载次数: 299)

需要注意的是,采用dna文件方式来开发XLL加载宏,并不能达到100%保密的效果,因为打包之后的dna文件依然是明码存在的。
要解决代码加密保护的问题,需要采用托管DLL方式开发,对不熟悉.net语言的人来说,虽然你依旧不必去考虑XLL的那7个接口函数,但还是复杂了一点。

因此,如果想彻底的保护你开发的工作表公式、VBA代码的话,学习.net语言还是很有必要的,至少比学习C++来开发XLL要容易多了。



TA的精华主题

TA的得分主题

 楼主| 发表于 2012-12-30 13:28 | 显示全部楼层
本帖最后由 liucqa 于 2012-12-30 16:43 编辑

使用Excel-DNA开发XLL加载宏---使用VBA对XLL加载宏进行自动注册和反注册

由于很多用户不具备基本的操作能力,因此有必要提供一个在Excel文件打开的时候,自动加载XLL功能。当然,你也可以将XLL加载宏放到专门的目录中,由Excel在启动时自行加载,不过那样的话,就变成了程序级别的加载宏了。

下面给出通过VBA来自动注册和反注册XLL加载宏的代码

1、通过RegisterXLL(方式一)
  1. ’注册代码
  2. Function LoadXll(XLLPath As String, XLLName As String) As Boolean
  3.     If (Application.RegisterXLL(XLLPath & XLLName)) Then
  4.         LoadXll = True
  5.     Else
  6.         LoadXll = False
  7.     End If
  8. End Function

  9. ‘反注册代码
  10. Application.ExecuteExcel4Macro ("UNREGISTER(""" & ThisWorkbook.Path & Application.PathSeparator & LoadXLLName & """)")
复制代码
2、通过Addins(方式二)
  1. ‘注册代码
  2. Function LoadXllAddins(XLLPath As String, XLLName As String) As Boolean
  3.     Dim i&, index&

  4.     If Len(Dir(XLLPath & XLLName)) > 0 Then
  5.         AddIns.Add Filename:=XLLPath & XLLName
  6.         For i = 1 To AddIns.Count
  7.             If AddIns(i).name = XLLName Then
  8.                 index = i
  9.                 Exit For
  10.             End If
  11.         Next
  12.         AddIns(index).Installed = True
  13.         LoadXllAddins = True
  14.     Else
  15.         LoadXllAddins = False
  16.     End If
  17. End Function

  18. '反注册代码
  19. Sub UnLoadXllAddins(XLLName As String)
  20.     Dim flag As Boolean
  21.     Dim i As Integer, index&

  22.     flag = False
  23.     For i = 1 To AddIns.Count
  24.         If AddIns(i).name = XLLName Then
  25.             index = i
  26.             flag = True
  27.             Exit For
  28.         End If
  29.     Next
  30.     If flag Then AddIns(index).Installed = False
  31. End Sub
复制代码

方式一的保密性较好,用户不能在Excel的加载宏里面看到加载宏的名字(2007版),但反注册之后会在函数列表中残留XLL的函数名称(这是一个bug),需要通过在XLL中写入隐藏函数的代码来解决。

方式二没有残留函数问题,但注册和反注册之后,都能在Excel选项的加载宏里面看到XLL的名称。

个人推荐普通用户使用方式二,有能力写.net代码的采用方式一。






TA的精华主题

TA的得分主题

 楼主| 发表于 2012-12-30 13:28 | 显示全部楼层
本帖最后由 liucqa 于 2013-1-1 22:31 编辑

使用Excel-DNA开发XLL加载宏---封装Excel自带的工作表函数和公式

嗯,费了半天力气,其实前面的内容都是为主题做扫盲的,现在终于谈到如何做保护Excel公式以及VBA代码封装的真正工作了{:soso_e112:}

俺认为,要想保护你在工作表之中的函数公式不被公开,开发成本最低,操作也最简单的唯一办法是:
在XLL文件中封装你在公式中用到的工作表函数,以及你的公式计算过程。

要保护VBA代码,也要在XLL中封装你的程序(其实就是重写代码)

这里暂时不谈如何重写VBA代码,重点探讨如何封装公式。

其实思路很简单,就是用另一个名字的函数,来实现与工作表函数相同的功能。问题的关键在于,我们不可能去重写工作表函数,那样的话,不如直接去微软上班了。
因此,我们要解决的问题就是,如何把调用工作表函数的参数传递给XLL,并在XLL内调用需要的WorkSheetFunction。

考虑本贴不是技术贴,论坛也不是.net论坛,我就不贴出详细的C#代码了,只说一下关键点:
1、获取xlCaller,这样就知道了调用函数时候的单元格位置
2、将形如=SUMIFS(A2:A11,B2:B11,C2:C11)里面的参数转成Range,这样才能传递给WorkSheetFunction。如果不转换的话,传递过来的参数是数组或者是引用。也可以用C API的函数来处理,不过在某些情况下API的bug会导致计算缓慢、死机和出错(2010会好些)。
3、将WorkSheetFunction返回的数值传递给调用函数
4、对错误的处理
5、要求.Net 4.0

如果有熟悉Excel-Dna和C#的会员感兴趣的话,欢迎QQ交流。
一些资料:
http://www.technicana.com/index.php?option=com_content&view=article&id=92

*************************************************************************************************

这有个例子,,供大家参考!
(12.27更新)使用xll加载宏作一机一码及封装工作表函数的演示,保护源代码,方便授权

*************************************

最后还是要说一句,使用.Net编程的最大弱点就是中间代码可以被反编译。
因此如果你对开发出来的.Net代码有非常强烈的保密要求的话,请使用混淆工具,并加壳(这都有专门的商业软件)。

Excel-DNA做出来的XLL并非是100%不可破解的(即使是用DLL打包),看看网络上90%的商业软件都有注册机各位就明白了。
使用这个工具,是为了提高开发速度和降低开发难度。若有特别需求,请换Dephi或者C/C++(非托管)代码开发(虽然也一样会被破解,但源码比较安全)。

*************************************

您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-22 13:18 , Processed in 0.046341 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表