可以在 windows 上将 tcl 包编译为 dll 吗?

can tcl package compiled to dll on windows?

我知道 tcl 代码可用于为 reuse.i 创建包遇到 "dll" 格式的 tcl 包(该包正在与 package require 使用 auto_path 命令,而不是 load 命令 ).

但我在网上搜索,只找到作为 tcl 脚本文件或作为 tcl 扩展(与 load 方法一起使用)的 tcl 包

  1. 是否可以创建 dll 格式的 tcl 包(可以使用其他语言)?

  2. 如果dll文件是tcl语言创建的,可以提取里面的代码吗?

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)可以做一个不错的它的工作。它足以击败除了最坚定的人以外的所有人。我自己不使用它,因为我不分发混淆代码,但我知道很多其他人推荐它。