我使用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概念的新手。
答案 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导出的使用解释器的函数。如果您不熟悉共享库的概念,那么我建议花一点时间阅读它们,尝试here和here进行背景阅读。