如何使一个可加载的DLL被任何程序使用TCL代码功能(How to make a loadable

2019-10-17 12:20发布

我创建了使用Tcl的GUI。 我希望做一些可用的TCL代码的核心功能,以通过其支持的dll的任何程序中使用。 对于我已经采取了非常简单的TCL的代码示例,它增加了两个整数,我已经写了交流的包装功能,使用该功能。 这是为我工作。 现在,我怎么能创造这两个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 ......."

}

在此可以使用上述TCL除了功能我的C包装函数:

#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的概念。

Answer 1:

为了创建.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文件导出功能使用解释的。 如果你不熟悉共享libaries的概念,那么我建议你花一点时间对他们阅读起来,尝试在这里和这里的一些背景阅读。



文章来源: How to make a loadable dll to use tcl code functionality by any program
标签: dll tcl