我想创建一些我的tcl方法的可加载dll。但我没有得到如何做到这一点。为此,我采用了一个简单的tcl api示例,它添加了两个数字并打印了总和。现在我想为此创建一个可加载的dll来导出这个tcl功能。但我不知道如何在视觉工作室做到这一点。我写了一个c代码,可以调用这个tcl api并得到两个整数的总和,但我再次不希望它这样做。我想创建一个dll文件来使用这个tcl功能。请告诉我如何在visual studio 2010上创建这个dll。任何帮助都绝对值得赞赏。
以下是我正在使用的示例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 <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv) {
Tcl_Interp *interp;
int code;
char *result;
Tcl_FindExecutable(argv[0]);
interp = Tcl_CreateInterp();
code = Tcl_Eval(interp, "source myscript.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);
}
我已使用以下命令成功编译了此代码 gcc simple_addition_wrapper_new.c -I / usr / include / tcl8.5 / -ltcl8.5 -o simple_addition_op
上面的代码正在使用预期的输出。
现在有人可以帮我解决在Visual Studio 2010中为此创建可加载dll的步骤。请帮助我,这对我来说非常紧急。
答案 0 :(得分:0)
如果你看一下这个问题的答案:here它给出了你需要经历的过程的基本概要。我的回答是关于创建DLL的一些Microsoft MSDN文章的链接。
更详细地介绍一下嵌入了Tcl的C ++ dll。
第一步是创建一个具有正确类型的新visual studio项目,该项目将构建一个导出符号的dll。我的示例项目名为TclEmbeddedInDll,该名称出现在由Visual Studio生成的符号(如TCLEMBEDDEDINDLL_API)中的代码中。
dllmain.cpp看起来像这样:
// dllmain.cpp : Defines the entry point for the DLL application.
#include "stdafx.h"
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
{
allocInterp() ;
break ;
}
case DLL_THREAD_ATTACH:
break ;
case DLL_THREAD_DETACH:
break ;
case DLL_PROCESS_DETACH:
{
destroyInterp() ;
break;
}
}
return TRUE;
}
allocInterp()
和destroyInterp()
函数在TclEmbeddedInDll.h中定义,这里使用函数而不是直接创建Tcl_Interp的原因是它保留了远离DLL接口的Tcl细节。如果你在这里创建interp然后你必须包含tcl.h然后当你尝试在另一个程序中使用DLL时,事情会变得复杂。
接下来显示TclEmbeddedInDll.h和.cpp,函数fnTclEmbeddedInDll()
是从DLL导出的函数 - 我使用C链接而不是C ++,因为它更容易调用其他语言的功能恕我直言。
// The following ifdef block is the standard way of creating macros which make exporting
// from a DLL simpler. All files within this DLL are compiled with the TCLEMBEDDEDINDLL_EXPORTS
// symbol defined on the command line. This symbol should not be defined on any project
// that uses this DLL. This way any other project whose source files include this file see
// TCLEMBEDDEDINDLL_API functions as being imported from a DLL, whereas this DLL sees symbols
// defined with this macro as being exported.
#ifdef TCLEMBEDDEDINDLL_EXPORTS
#define TCLEMBEDDEDINDLL_API __declspec(dllexport)
#else
#define TCLEMBEDDEDINDLL_API __declspec(dllimport)
#endif
extern "C" {
TCLEMBEDDEDINDLL_API void fnTclEmbeddedInDll(void);
}
void allocInterp() ;
void destroyInterp() ;
// TclEmbeddedInDll.cpp : Defines the exported functions for the DLL application.
//
#include "stdafx.h"
extern "C" {
static Tcl_Interp *interp ;
// This is an example of an exported function.
TCLEMBEDDEDINDLL_API void fnTclEmbeddedInDll(void)
{
int code;
const char *result;
code = Tcl_Eval(interp, "source simple_addition.tcl; add_two_nos");
result = Tcl_GetString(Tcl_GetObjResult(interp));
}
}
void allocInterp()
{
Tcl_FindExecutable(NULL);
interp = Tcl_CreateInterp();
}
void destroyInterp()
{
Tcl_DeleteInterp(interp);
}
allocInterp()和destroyInterp()的实现非常幼稚,没有进行错误检查。
最后,对于Dll,stdafx.h文件将它们绑定在一起,如下所示:
// stdafx.h : include file for standard system include files,
// or project specific include files that are used frequently, but
// are changed infrequently
//
#pragma once
#include "targetver.h"
#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers
// Windows Header Files:
#include <windows.h>
// TODO: reference additional headers your program requires here
#include <tcl.h>
#include "TclEmbeddedInDll.h"