C++/Tk/Tcl拡張/Visual StudioでDLLを作成
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
''[[FrontPage]]''
* visual studioでDLLを作成する [#w92fcb16]
C言語で書いたコードをTclから呼び出すTcl拡張を、visual stu...
ソースコード中のコメントとプロジェクトのキャプチャを参考...
** 制約事項 [#ea4fe6e8]
visual studioで開発していくことを前提とする。~
~
~
#ref(http://bj006.com/images/c++_tcl_dll_090502_01.png)
#ref(http://bj006.com/images/c++_tcl_dll_090502_02.png)
#ref(http://bj006.com/images/c++_tcl_dll_090502_03.png)
#ref(http://bj006.com/images/c++_tcl_dll_090502_04.png)
[[おまけ - プリコンパイル済みヘッダを使用する(上):http://...
[[おまけ - プリコンパイル済みヘッダを使用する(中):http://...
[[おまけ - プリコンパイル済みヘッダを使用する(下):http://...
ファイル名:StyleDll.h
#ifndef STYLE_DLL ...
#define STYLE_DLL ...
...
#define USE_TCL_STUBS 1 ...
...
extern "C" ...
{ ...
__declspec( dllexport ) s4 Dlltest_Init( Tcl_Interp*...
} ...
...
#endif ...
ファイル名:StyleDll.cpp
#include "X:\XXXXX\XXXXXX\XXXXXXXX\pch.h" ...
#include "./StyleDll.h" ...
...
/* DLL Test ********************************************...
static s4 dllTest( ClientData clientData, ...
Tcl_Interp *interp, ...
s4 objc, ...
Tcl_Obj * CONST objv[] ) ...
{ ...
s4 rntCod = TCL_OK; ...
...
Tcl_AppendResult( interp, ...
objv[ZERO]->bytes, ...
" is called. arg1 is ", ...
objv[ONE]->bytes, NULL ); ...
...
return( rntCod ); ...
} ...
//*DLL Test ********************************************...
/* Initialize DLL Test *********************************...
s4 Dlltest_Init( Tcl_Interp *interp ) ...
{ ...
s4 rntCod = TCL_OK; ...
...
for( ; ; ) ...
{ ...
if( NULL == Tcl_InitStubs( interp, "8.1", ZERO )...
{ ...
rntCod = TCL_ERROR; ...
break; ...
} ...
...
Tcl_CreateObjCommand( interp, "Dlltest", dllTest...
} ...
...
return( rntCod ); ...
} ...
//*Initialize DLL Test *********************************...
ファイル名:pch.cpp
#include "X:\XXXXX\XXXXXX\XXXXXXXX\pch.h" ...
...
ファイル名:pch.h
#include "./comm.h" ...
ファイル名:comm.h
#ifndef COMM_H ...
#define COMM_H ...
...
//#pragma comment( lib, "wsock32.lib" ) ...
#pragma comment( lib, "tcl85.lib" ) ...
#pragma comment( lib, "tk85.lib" ) ...
...
#include <tchar.h> ...
#include <tcl.h> ...
//#include <winsock.h> ...
#include <winsock2.h> ...
#include <windows.h> ...
//#include <commdlg.h> ...
#include <stdio.h> ...
#include <fstream> ...
#include <iostream> ...
#include <string> ...
//#include <vector> ...
//#include <sstream> ...
#include <wchar.h> ...
#include <stdlib.h> ...
//#include <boost/regex.hpp> ...
//#include <stdarg.h> ...
...
//#using <mscorlib.dll> ...
...
using namespace std; ...
//using namespace boost; ...
...
//extern HINSTANCE vc_hInst; ...
//extern HWND vc_hWnd; ...
...
...
#define PROC_NG (-1) ...
#define FUNC_NG_NEGATIVE (-1) ...
#define FUNC_NG 0 ...
#define END_MSG 0 ...
#define PROCESS_OK 0 ...
#define RET_OK 0 ...
#define RET_NG (-1) ...
#define WND_HEIGHT 350 ...
#define WND_WIDTH 570 ...
#define IND_TRUE 1 ...
#define IND_FALSE 0 ...
#define ZERO 0 ...
#define ONE 1 ...
#define MINUS_ONE (-1) ...
#define FFFF 65535 ...
#define FF 255 ...
#define IND_DUM (-8) ...
...
...
#define MAX_F_NAME 260 ...
...
...
//#define SCRN_POS_X 50 ...
//#define SCRN_POS_Y 50 ...
...
typedef bool b0; ...
typedef unsigned char u1; ...
typedef signed char s1; ...
typedef unsigned int u4; ...
typedef signed int s4; ...
typedef long f4; ...
typedef double f8; ...
typedef unsigned short u2; ...
typedef signed short s2; ...
typedef int Tcl_PackageInitProc( Tcl_Interp *interp ); ...
...
const f8 ROUND_OFF_RATE = (0.5); ...
...
//#include "./StyleDll.h" ...
...
//using namespace dNet; ...
...
...
#endif ...
ファイル名:PR_dll.tcl
# HEAD *************************************************...
package require Tk ...
#/HEAD *************************************************...
# Namespace PR_DLL *************************************...
namespace eval PR_DLL { ...
namespace export * ...
# Dll Test *********************************************...
proc dllTest {} { ...
...
# .tBar02.r_msg configure -text "platform = $::tcl_pl...
switch $::tcl_platform(platform) {
windows { ...
load StyleDll.dll Dlltest ...
# load [file join [pwd] StyleDll.dll Dlltest]...
set interp [Dlltest "Hello"] ...
} ...
unix { ...
# load [file join [pwd] libfoo[info sharedlib...
} ...
} ...
# .tBar02.l_msg configure -text "interp = $interp" ...
} ...
#/Dll Test *********************************************...
} ...
#/Namespace PR_DLL *************************************...
package provide pr_dll 0.01 ...
*** 修正履歴 [#a1ac3d25]
~
*** 課題 [#e4006fe7]
以下の概念を、管理人自身がいまいち理解してない。~
+Tcl API~
+extern "C"~
~
やりながら覚える。~
ここまで(ロードまで)できればあとはなんとかなる。~
-備考~
初期化関数名に注意が必要です。~
"大文字なんとか_Init" → "load XXXX.dll 大文字なんとか"の...
Tcl_CreateObjCommandで登録するコマンド名は小文字で始まっ...
(TclのdllTestと名前が競合するのを避け、また拡張コマンド...
*** 参考ページ [#z7cd6fa1]
[[Re: How to build a loadable tcl dll with visual studio ...
[[なもなも - 簡単なTclコマンドを作るには:http://www.geoci...
終了行:
''[[FrontPage]]''
* visual studioでDLLを作成する [#w92fcb16]
C言語で書いたコードをTclから呼び出すTcl拡張を、visual stu...
ソースコード中のコメントとプロジェクトのキャプチャを参考...
** 制約事項 [#ea4fe6e8]
visual studioで開発していくことを前提とする。~
~
~
#ref(http://bj006.com/images/c++_tcl_dll_090502_01.png)
#ref(http://bj006.com/images/c++_tcl_dll_090502_02.png)
#ref(http://bj006.com/images/c++_tcl_dll_090502_03.png)
#ref(http://bj006.com/images/c++_tcl_dll_090502_04.png)
[[おまけ - プリコンパイル済みヘッダを使用する(上):http://...
[[おまけ - プリコンパイル済みヘッダを使用する(中):http://...
[[おまけ - プリコンパイル済みヘッダを使用する(下):http://...
ファイル名:StyleDll.h
#ifndef STYLE_DLL ...
#define STYLE_DLL ...
...
#define USE_TCL_STUBS 1 ...
...
extern "C" ...
{ ...
__declspec( dllexport ) s4 Dlltest_Init( Tcl_Interp*...
} ...
...
#endif ...
ファイル名:StyleDll.cpp
#include "X:\XXXXX\XXXXXX\XXXXXXXX\pch.h" ...
#include "./StyleDll.h" ...
...
/* DLL Test ********************************************...
static s4 dllTest( ClientData clientData, ...
Tcl_Interp *interp, ...
s4 objc, ...
Tcl_Obj * CONST objv[] ) ...
{ ...
s4 rntCod = TCL_OK; ...
...
Tcl_AppendResult( interp, ...
objv[ZERO]->bytes, ...
" is called. arg1 is ", ...
objv[ONE]->bytes, NULL ); ...
...
return( rntCod ); ...
} ...
//*DLL Test ********************************************...
/* Initialize DLL Test *********************************...
s4 Dlltest_Init( Tcl_Interp *interp ) ...
{ ...
s4 rntCod = TCL_OK; ...
...
for( ; ; ) ...
{ ...
if( NULL == Tcl_InitStubs( interp, "8.1", ZERO )...
{ ...
rntCod = TCL_ERROR; ...
break; ...
} ...
...
Tcl_CreateObjCommand( interp, "Dlltest", dllTest...
} ...
...
return( rntCod ); ...
} ...
//*Initialize DLL Test *********************************...
ファイル名:pch.cpp
#include "X:\XXXXX\XXXXXX\XXXXXXXX\pch.h" ...
...
ファイル名:pch.h
#include "./comm.h" ...
ファイル名:comm.h
#ifndef COMM_H ...
#define COMM_H ...
...
//#pragma comment( lib, "wsock32.lib" ) ...
#pragma comment( lib, "tcl85.lib" ) ...
#pragma comment( lib, "tk85.lib" ) ...
...
#include <tchar.h> ...
#include <tcl.h> ...
//#include <winsock.h> ...
#include <winsock2.h> ...
#include <windows.h> ...
//#include <commdlg.h> ...
#include <stdio.h> ...
#include <fstream> ...
#include <iostream> ...
#include <string> ...
//#include <vector> ...
//#include <sstream> ...
#include <wchar.h> ...
#include <stdlib.h> ...
//#include <boost/regex.hpp> ...
//#include <stdarg.h> ...
...
//#using <mscorlib.dll> ...
...
using namespace std; ...
//using namespace boost; ...
...
//extern HINSTANCE vc_hInst; ...
//extern HWND vc_hWnd; ...
...
...
#define PROC_NG (-1) ...
#define FUNC_NG_NEGATIVE (-1) ...
#define FUNC_NG 0 ...
#define END_MSG 0 ...
#define PROCESS_OK 0 ...
#define RET_OK 0 ...
#define RET_NG (-1) ...
#define WND_HEIGHT 350 ...
#define WND_WIDTH 570 ...
#define IND_TRUE 1 ...
#define IND_FALSE 0 ...
#define ZERO 0 ...
#define ONE 1 ...
#define MINUS_ONE (-1) ...
#define FFFF 65535 ...
#define FF 255 ...
#define IND_DUM (-8) ...
...
...
#define MAX_F_NAME 260 ...
...
...
//#define SCRN_POS_X 50 ...
//#define SCRN_POS_Y 50 ...
...
typedef bool b0; ...
typedef unsigned char u1; ...
typedef signed char s1; ...
typedef unsigned int u4; ...
typedef signed int s4; ...
typedef long f4; ...
typedef double f8; ...
typedef unsigned short u2; ...
typedef signed short s2; ...
typedef int Tcl_PackageInitProc( Tcl_Interp *interp ); ...
...
const f8 ROUND_OFF_RATE = (0.5); ...
...
//#include "./StyleDll.h" ...
...
//using namespace dNet; ...
...
...
#endif ...
ファイル名:PR_dll.tcl
# HEAD *************************************************...
package require Tk ...
#/HEAD *************************************************...
# Namespace PR_DLL *************************************...
namespace eval PR_DLL { ...
namespace export * ...
# Dll Test *********************************************...
proc dllTest {} { ...
...
# .tBar02.r_msg configure -text "platform = $::tcl_pl...
switch $::tcl_platform(platform) {
windows { ...
load StyleDll.dll Dlltest ...
# load [file join [pwd] StyleDll.dll Dlltest]...
set interp [Dlltest "Hello"] ...
} ...
unix { ...
# load [file join [pwd] libfoo[info sharedlib...
} ...
} ...
# .tBar02.l_msg configure -text "interp = $interp" ...
} ...
#/Dll Test *********************************************...
} ...
#/Namespace PR_DLL *************************************...
package provide pr_dll 0.01 ...
*** 修正履歴 [#a1ac3d25]
~
*** 課題 [#e4006fe7]
以下の概念を、管理人自身がいまいち理解してない。~
+Tcl API~
+extern "C"~
~
やりながら覚える。~
ここまで(ロードまで)できればあとはなんとかなる。~
-備考~
初期化関数名に注意が必要です。~
"大文字なんとか_Init" → "load XXXX.dll 大文字なんとか"の...
Tcl_CreateObjCommandで登録するコマンド名は小文字で始まっ...
(TclのdllTestと名前が競合するのを避け、また拡張コマンド...
*** 参考ページ [#z7cd6fa1]
[[Re: How to build a loadable tcl dll with visual studio ...
[[なもなも - 簡単なTclコマンドを作るには:http://www.geoci...
ページ名: