1

我已经使用 tcl 创建了一个 GUI。我想让 tcl 代码的一些核心功能可供任何支持 dll 的程序使用。为此,我采用了一个非常简单的 tcl 代码示例,它添加了两个整数,并且我编写了 ac 包装函数来使用此功能。这对我有用。现在我如何为这两个 c 和 tcl 文件创建一个 dll,以便任何程序都可以通过简单地加载 dll 来使用这个附加功能。

这是我的简单 tcl 代码:

/* Filename : simple_addition.tcl */

#!/usr/bin/env tclsh8.5

proc add_two_nos { } {

set a 10

set b 20

set c [expr { $a + $b } ]

puts " c is $c ......."

}

这是我的 c 包装函数,它使用上述 tcl 附加功能:

#include <tcl.h>
#include <tclDecls.h>
#include <tclPlatDecls.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>


int main (int argc, char **argv) {
    Tcl_Interp *interp;
    int code;
    char *result;

    printf("inside main function \n");
    Tcl_FindExecutable(argv[0]);
    interp = Tcl_CreateInterp();
    code = Tcl_Eval(interp, "source simple_addition.tcl; add_two_nos");

    /* Retrieve the result... */
    result = Tcl_GetString(Tcl_GetObjResult(interp));

    /* Check for error! If an error, message is result. */
    if (code == TCL_ERROR) {
    fprintf(stderr, "ERROR in script: %s\n", result);
    exit(1);
    }

    /* Print (normal) result if non-empty; we'll skip handling encodings for now */
    if (strlen(result)) {
    printf("%s\n", result);
    }

    /* Clean up */
    Tcl_DeleteInterp(interp);
    exit(0);
}

这个 c 包装器对我来说工作得很好,并给出了正确的结果。

现在我想创建一个 dll 文件,这样如果我将该 dll 包含到任何支持 dll 的程序中,它应该能够使用上述 tcl 代码的这个附加功能。谁能告诉我我能做到的方式。请帮我。我是这个 dll 概念的新手。

4

1 回答 1

0

为了创建 .dll,您必须使用 Visual Studio 和 C 或 C++ 之类的工具来创建 .dll(有很多其他工具可以创建 .dll 文件,但 VS 很容易掌握和使用。)所以在VS中新建一个项目,这需要是一个C++ WIN32项目。选择 DLL 应用程序类型和导出符号附加选项。

VS 将创建一个基本的 .dll,然后你可以修改它来做你想做的事。我简短地说,我会考虑将 intrepter 的创建/销毁放入 dllmain:

BOOL APIENTRY DllMain( HMODULE hModule,
    DWORD  ul_reason_for_call,
    LPVOID lpReserved
    )
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
        {
            Tcl_FindExecutable(NULL);
            interp = Tcl_CreateInterp();
        }
    case DLL_THREAD_ATTACH:
        break ;
    case DLL_THREAD_DETACH:
        break ;
    case DLL_PROCESS_DETACH:
        {
            Tcl_DeleteInterp(interp);
            break;
        }
    }
    return TRUE;
}

然后创建使用解释器的 .dll 导出的函数。如果您不熟悉共享库的概念,那么我建议您花一点时间阅读它们,在这里这里尝试一些背景阅读。

于 2012-12-18T15:02:00.863 回答