如何从 Tcl 脚本访问第三方 DLL?
Posted
技术标签:
【中文标题】如何从 Tcl 脚本访问第三方 DLL?【英文标题】:How do I access a third party DLL from a Tcl script? 【发布时间】:2013-01-17 17:18:59 【问题描述】:我正在尝试学习如何从 Tcl 脚本访问第三方 DLL。在很多地方有很多关于这个主题的信息,但是没有一个很好的,简洁的从头到尾描述如何做到这一点。我尝试了很多事情,但都失败了。我使用 SWIG 和 Visual Studio Express 2012 获得了最接近成功的机会(我都是新手……)
我在How to create a DLL with SWIG from Visual Studio 2010 看到了对类似问题的先前回复,其中目标是创建 C 代码中的 DLL。我没有 DLL 的源代码,只有创建 DLL 的供应商提供的 .dll、.h 和 .lib 文件。
我认为,该帖子中的响应者的说明与我正在寻找的内容非常接近。他表示包装 DLL 的过程是相似的,并询问是否需要指令来完成此操作。我希望他能回应这篇文章......
(免责声明:我也是这个论坛的新手,我无法找到直接跟进该帖子的方法。请原谅我的无知......)
谁能提供有关如何实现我的目标的详细说明?提前致谢!
【问题讨论】:
(希望更多的“新手”像你一样认真。) 【参考方案1】:在我使用过的 Tcl 中访问共享库有两种选择。
-
编写一个已编译的“C”扩展。这可以手动编码或通过 SWIG 完成。扩展通常只是 Tcl 解释器和共享库中的函数之间的一段粘合代码。 SWIG 不是我的强项,所以其他人必须在那里帮助你。如果您编写“C”扩展,Tcl 源代码中有一个示例扩展,Tcl wiki 中有相当多的帮助。
使用通用共享对象调用程序。我通常使用的是“ffidl”。一个简单的谷歌将指向它。要使用通用共享对象调用程序,您通常必须调用一些 Tcl 命令来定义被调用函数的接口,然后它会处理加载库、查找入口点并实际调用函数并返回结果。
哪个最好取决于您的情况。如果库相对较小,我通常只是手动编写扩展代码。如果它很大,我只想调用几个函数,那么我通常使用 ffidl 来完成繁重的工作。
【讨论】:
还有Critcl,它可以让你编写嵌入在 Tcl 中的“手动”扩展。以上是关于如何从 Tcl 脚本访问第三方 DLL?的主要内容,如果未能解决你的问题,请参考以下文章
从 WCF 服务如何以当前用户而不是 IIS\DefaultApppool 的身份调用第三方 dll 中的方法