1

tcl を使用して GUI を作成しました。Tcl コードのコア機能のいくつかを、dll をサポートするすべてのプログラムで使用できるようにしたいと考えています。そのために、2 つの整数を加算する非常に単純な Tcl コードの例を取り上げ、この機能を使用するための AC ラッパー関数を作成しました。これは私のために働いています。これら 2 つの 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の概念に不慣れです。

4

1 に答える 1

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 によってエクスポートされる関数を作成します。共有ライブラリの概念に慣れていない場合は、少し時間をかけてそれらを読んでみることをお勧めします。ここここを試して背景を読んでください。

于 2012-12-18T15:02:00.863 に答える