2

我正在尝试使用 TclDevKit 的 TclServiceManager 在我的 Windows 机器上安装 Tcl 程序作为服务。我正在一步一步地遵循这里的指南,但我遇到了很多问题。

如果我尝试使用我的原始 .tcl 文件来创建服务,我会收到以下错误:

Error 1053: The service did not respond to the start or control request in a timely fashion.

我在此处遵循了此问题的解决方案,以便在服务控制管理器终止程序之前有更多时间启动程序;无济于事。

然后我决定尝试使用 TclApp 包装程序,看看是否有效。正如指南所说,我使用了base-tclsvc-win32-ix86.exe位于我的 TclDevKit bin 目录中的前缀文件。以这种方式安装服务,然后尝试运行它会导致以下错误:

Windows could not start the <service name> service on Local Computer.
Error 1067: The process terminated unexpectedly. 

根本没有太多信息可以让我在谷歌上搜索这个错误。唯一的 Stackoverflow 帖子就是这个。所以我尝试通过命令提示符手动安装服务<TheProgram>.exe <Service Name> -install并尝试运行它 - 仍然给了我同样的错误。

然后我试着看看我是否可以通过运行获得任何有用的信息<TheProgram>.exe <Service Name> -debug,有趣的是我得到了以下输出:

Debugging <Service Name>. 
InitTypes: failed to find the DictUpdateInfo AuxData type

abnormal program termination

谷歌搜索InitTypes: failed to find the DictUpdateInfo AuxData type让我无处可去,但它似乎与 Tcl 相关。

最后,如果它意味着什么,我试图作为服务安装的程序的源代码是一些简单的 Web 服务器代码:

proc Serve {chan addr port} {
    fconfigure $chan -translation auto -buffering line 
    set line [gets $chan]
    set path [file join . [string trimleft [lindex $line 1] /]]
    if {$path == "."} {set path ./index.html}

    if {[catch {
        set f1 [open $path]
    } err]} {
        puts $chan "HTTP/1.0 404 Not Found"
    } else {
        puts $chan "HTTP/1.0 200 OK"
        puts $chan "Content-Type: text/html"
        puts $chan ""
        puts $chan [read $f1]
        close $f1
    }

    close $chan
}

if {![info exists reload]} {
    set sk [socket -server Serve 3000]
    puts "Server listening on port 3000"
    vwait forever
} else {
    unset reload
}

为了检查源代码是否存在问题,我尝试了另一个更简单的示例,它只是在特定目录中创建了一个文件:

set filePath "C:/some/path/here";
set fileName "Test.txt";

set file [open [file join $filePath $fileName] w];
puts $file "Hello, World";

close $file;

如果您只是从 tclsh86.exe 获取它们,这两个程序都可以工作,但如果您尝试将它们分别作为解包和打包的服务运行,则会出现上述错误。

有任何想法吗?

4

0 回答 0