我知道tcl代码可以用来创建包以便重用。我遇到了一个“dll”格式的tcl包(该包与package require
命令一起使用auto_path
,而不是load
命令)。
但我在网上搜索,只发现tcl包作为tcl脚本文件或tcl扩展名(与load
方法一起使用)
是否可以用dll格式创建tcl包(可能使用其他语言)?
如果dll文件是用tcl语言创建的,我可以在其中提取代码吗?
答案 0 :(得分:0)
Tcl中的包严格来说是一个高级概念,它远离实现功能包的方式。当您说package require foo
时,软件包管理器就会消失,并查找如何实际获取软件包,并将其提供给您。
那么它们是如何实施的?核心思想是有一个特定格式的索引文件,它描述了一系列要做的事情,通常使用source
来获取脚本和load
以获取DLL。这是一个包实际使用?取决于包裹。 (还有一些方法可以在没有索引文件的情况下完成包,但是Tcl模块在其他方面是一个相当复杂的主题。)
但是,如果你真正得到的只是DLL,你可以直接load
。执行此操作时,请使用文件的绝对路径名;没有目录分隔符的名称由于历史原因而以不同方式工作(它们调用系统库发现机制,如果您知道它是哪个文件,则不需要它。)
# Any form that Tcl understands filenames in will do; I use / because it isn't a quote char
load C:/the/path/to/the/library.dll
这就是你真正需要做的一切。使用索引文件正确安装软件包的唯一优势是使脚本可以移植到具有不同安装位置的某个位置(并使您有机会描述软件包版本控制要求)。哪个方便,但对你自己做的事情并不重要。
那么,它怎么能到达那里?好吧,Tcl实际上并不太关心。只要DLL包含正确的入口点函数(名称取决于dll名称;对于frobnicate.dll
,它将查找Frobnicate_Init
;这是可重写的)它将起作用。制作它们的通常语言是C和C ++,但任何可以制作正确功能的语言都可以使用。对于需要复杂运行时才能运行的语言来说,这有点困难,但这取决于你。
有一些工具可以从Tcl代码生成DLL,但它们通常不是为了使提取代码变得容易,因为它们是故意的混淆器或者因为(在一种情况下,我是他们正在将Tcl代码转换为机器代码;没有任何资源可供提取。另一方面,有一些方法来打包代码,以便它只包含在DLL中,所以也许就是这里发生的事情。你可以做的就是提取真的就是把代码弹出到一个工具中,从二进制代码中提取字符串(Unix strings
实用程序对于这个是理想的)并查看是否有可能看起来的东西;可能没有,但你可能会幸运。
反汇编一个相当随意的DLL将会令人不快。如果它是一个启用了Tcl Stubs的DLL,那将会特别令人讨厌,因为它通过API参考处理程序替换了对Tcl的API的调用(对于了解何时进行反汇编!),并且看起来真的在拆卸层面上令人困惑。
如果您真的在问这个问题,因为您正在考虑如何打包自己的代码,以便用户不会将其拆开,那么有一个商业工具(来自ActiveState的TclDevKit)可以做得很好它。除了最极端的决心之外,它足以打败所有人。我不自己使用它,因为我不分发混淆代码,但我知道很多其他推荐它的人。