Tcl Starkit与MySql
有人知道MySql使用Tcl Starkit需要哪些文件吗?目前,我有libmySQL.dll、libmysqltcl.dll和pkgIndex.tcl。pkgIndex.tcl具有以下代码:Tcl Starkit与MySql,mysql,tcl,Mysql,Tcl,有人知道MySql使用Tcl Starkit需要哪些文件吗?目前,我有libmySQL.dll、libmysqltcl.dll和pkgIndex.tcl。pkgIndex.tcl具有以下代码: proc loadmysqltcl {dir} { set oldcwd [pwd] cd $dir load libmysqltcl[info sharedlibextension] cd $oldcwd } package ifneeded mysqltcl 3.03 [
proc loadmysqltcl {dir} {
set oldcwd [pwd]
cd $dir
load libmysqltcl[info sharedlibextension]
cd $oldcwd
}
package ifneeded mysqltcl 3.03 [list loadmysqltcl $dir]
这些文件位于我的Tcl应用程序库文件夹中。到目前为止,在我包装我的应用程序并运行exe之后。文件,我得到一个错误:
无法加载库
“C:/…TCL1055.tmp”:在执行“load libmysqltcl[info sharedlibextension]”时,在库路径中找不到此库或从属库
此外,我注意到,每次尝试运行应用程序时,丢失的.tmp文件都会发生更改
有人成功地使用了Tcl/MySql starkit(适用于Windows)吗
谢谢
DFMstarkit使用一些奇特的技巧,以便能够加载存储在绑定到starkit本身的虚拟文件系统中的库。在Unix上,可以指示OS库加载器从任意数据块加载库,但在Windows上,只能从磁盘上的实际文件加载库 为了适应这种限制,Windows starkits首先将库作为临时文件从虚拟文件系统复制到真实文件系统。这就是你的临时文件名的来源 现在,只要starkit中的库本身不依赖于starkit中的其他库,所有这些都可以正常工作。在您的情况下,您的libmysqltcl.dll可能依赖于libmySQL.dll。在加载时,这两个文件都被复制到了真实的文件系统中,但是使用了临时文件名,因此加载程序无法找到libmySQL.dll 您有两个选择来解决此问题:
set dirname [file dirname [info script]]
set tmpdir [file join $env(TEMP) __myapp__]
file mkdir $tmpdir
foreach dll {libmySQL.dll} {
if { ![file exists [file join $tmpdir $dll]] } {
file copy -force [file join $dirname bin $dll] $tmpdir
}
}
set ::env(PATH) "$tmpdir;$env(PATH)"
然后,您应该能够按照预期完成您的软件包要求
这肯定有点笨重,但责任完全在于Windows不允许您从内存而不是文件加载库代码。谢谢Eric-我尝试了选项2,但运气不好。我将您的代码放在我的应用程序中的“package require mysqltcl”下面。然后我把它包起来,试着运行它,但运气不好。我还将您的代码放在pkgIndex.tcl文件中,无论是否包含所包含的代码,它都无法工作。听起来你的答案应该有用,所以我觉得我做错了什么。另外,我将“myapp”改为真正的应用程序名,即Small_Business_Database_应用程序。我希望名字中的下划线不会影响我的成绩。你有什么建议吗?谢谢,DFM此代码必须在“包要求”之前出现。另外,如果您将此代码放在进程中,请确保将“$env(TEMP)”更改为“$::env(TEMP)”。感谢您的后续操作。我真的很感谢你的帮助。现在一切正常。你好,DFM