如何使一个可加载的DLL使用任何程序的tcl代码功能

时间:2012-12-18 09:03:28

标签: dll tcl

我使用tcl创建了一个GUI。我想使tcl代码的一些核心功能可供任何支持dll的程序使用。为此,我采用了一个非常简单的tcl代码示例,它添加了两个整数,并且我编写了一个c包装函数来使用此功能。这对我有用。现在我如何为这两个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概念的新手。

1 个答案:

答案 0 :(得分:0)

为了创建.dll,你必须使用像Visual Studio和C或C ++这样的东西来创建.dll(还有很多其他工具可以创建.dll文件,但VS很容易获得保持和使用。)所以在VS创建一个新项目,这需要是一个C ++ WIN32项目。选择DLL应用程序类型和“导出符号附加”选项。

VS将创建一个基本的.dll,然后你可以修改它来做你想要的。我简短地说,我会将内部的创建/破坏放入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导出的使用解释器的函数。如果您不熟悉共享库的概念,那么我建议花一点时间阅读它们,尝试herehere进行背景阅读。