-
c语言入门之BCB客户端tuxedo开发实例
tuxedo 的函数很多,所有应用都使用其中子集。这些函数子集包含在开发
包中一定的动态库中。下面以
tpinit,tpcall,tpterm,tpfree,tpalloc,Fget32,Fchg32,FLDOCC32 几个函数为
例介绍一下在该子集下的编程方式。(不是很准哟)
1、首先 找到这些函数所在的动态库。经过解析发现以上函数包含
在"wtuxws32.dll","libfml32.dll" 两个动态库中。多好,有了这两个动
态库,应用程序发行时,带上他们就可以了。再也不会出现 操作系统弹出
的动态库定位错误了。 且慢,后经研究发现,光有这两个dll不行,他们
的运行还需如下6个dll:libbuft.dll,libengine.dll,libfml.dll,
libgpnet.dll,libtux.dll,libwsc.dll。 哈哈。总算解析完了。
好,把这些文件copy出来到自己的工程目录下。多棒。赶紧进入下一步。
2、配置编译环境。这很重要。为使大家编程方便,我们做些小动作。在
BCB 的安装目录下(即$(BCB)标识的目录)建立tuxedo\目录,将
tuxedo开发包中的 \bin\,\include\,\lib\几个目录拷贝到该目录下。
然后,在Option|Directories/Conditionals中设置
Include Path : $(BCB)\Tuxedo\include
Library Path : $(BCB)\Tuxedo\lib
好了,环境设置好了。在你的工程中include :
#include <atmi.h>
#include <fml32.h>
#include <tmenv.h>
哦,他们三个文件实在太重要了,不包含进来你会后悔的:)
3、建立一个tuxedo子集函数结构。为什么这样做呢,直接使用tuxedo函数
不好吗? 这没什么的,依个人编程环境而定。我习惯于在结构名下
使用这些 外来开发包中的函数,因为你对他们不是很熟,有时会遗忘
其名称,将其放在结构中,利用BCB自动提示功能,你就可以很容易
找到(想起)需要的函数了。我定义的结构如下:
typedef
struct _FunTuxedo
{
int
(_TMDLLENTRY *
tpcall)(char _TM_FAR *,
char _TM_FAR *,
long ,
char _TM_FAR * _TM_FAR *,
long _TM_FAR *,
long );
int
(_TMDLLENTRY *
tpinit)(TPINIT _TM_FAR *);
int
(_TMDLLENTRY *
tpterm)(void);
void
(_TMDLLENTRY *
tpfree)(char _TM_FAR *);
char *
(_TMDLLENTRY *
tpalloc)(char _TM_FAR *,
char _TM_FAR *,
long);
int
(_TMDLLENTRY *
Fget32)(FBFR32 _TM_FAR *,
FLDID32,
FLDOCC32,
char _TM_FAR *,
FLDLEN32 _TM_FAR *);
int
(_TMDLLENTRY *
Fchg32)(FBFR32 _TM_FAR *,
FLDID32,
FLDOCC32,
char _TM_FAR *,
FLDLEN32);
FLDOCC32
(_TMDLLENTRY *
Foccur32)( FBFR32 _TM_FAR *,
FLDID32);
HMODULE hLibfml32; // libfml32.dll 动态库句柄
HMODULE hWtuxws32; // wtuxws32.dll 动态库句柄
}FUNTUXEDO,*PFUNTUXEDO;
这里,我将两个动态库句柄加入到了结构中,是因为我打算动态使用
tuxedo中间件。方便我释放他们。,下一节介绍装载/释放他们
4 装载、释放中间件(基于FUNTUXEDO结构)
哈,这很容易,主要用到LoadLibrary,FreeLibrary,GetProcAddress
三个函数。装载代码如下:
PFUNTUXEDO pFun;
//Loading Fchg32, Fget32 by LIBFML32.DLL
pFun->hLibfml32 = LoadLibrary("libfml32.dll");
if (pFun->hLibfml32 == NULL)
{
return -1;
}
(FARPROC &)pFun->Fchg32
=(FARPROC)GetProcAddress(pFun->hLibfml32,"Fchg32");
(FARPROC &)pFun->Fget32
=(FARPROC)GetProcAddress(pFun->hLibfml32,"Fget32");
(FARPROC &)pFun->Foccur32
=(FARPROC)GetProcAddress(pFun->hLibfml32,"Foccur32");
if (pFun->Fchg32 == NULL || pFun->Fget32 == NULL || pFun->Foccur32 == NULL)
{
FreeLibrary(pFun->hLibfml32);
pFun->hLibfml32 = NULL;
return -2;
}
//Loading tpacall, tpalloc, tpfree, tpinit, tpterm by WTUXWS32.DLL
pFun->hWtuxws32 = LoadLibrary("wtuxws32.dll");
if (pFun->hWtuxws32 == NULL)
{
FreeLibrary(pFun->hLibfml32);
pFun->hLibfml32 = NULL;
return -3;
}
(FARPROC &)pFun->tpcall
=(FARPROC)GetProcAddress(pFun->hWtuxws32,"tpacall");
(FARPROC &)pFun->tpalloc
=(FARPROC)GetProcAddress(pFun->hWtuxws32,"tpalloc");
(FARPROC &)pFun->tpfree
=(FARPROC)GetProcAddress(pFun->hWtuxws32,"tpfree");
(FARPROC &)pFun->tpinit
=(FARPROC)GetProcAddress(pFun->hWtuxws32,"tpinit");
(FARPROC &)pFun->tpterm
=(FARPROC)GetProcAddress(pFun->hWtuxws32,"tpterm");
if (pFun->tpcall == NULL || pFun->tpalloc == NULL ||
pFun->tpfree == NULL || pFun->tpinit == NULL ||
pFun->tpterm == NULL)
{
FreeLibrary(pFun->hLibfml32);
pFun->hLibfml32 = NULL;
FreeLibrary(pFun->hWtuxws32);
pFun->hWtuxws32 = NULL;
return -4;
}
释放时很简单,只需
FreeLibrary(pFun->hLibfml32);
FreeLibrary(pFun->hWtuxws32);
即可。
5、使用。例:...的内容查帮助吧。
PFUNTUXEDO pFun;
char *pSendBuff;
char *pRecvBuff;
long lRet;
short sRet;
int iRet;
//中间件服务
pSendBuff = pFun->tpalloc(...);
if (pSendBuff == NULL)
{
return ERR_TUXEDO;
}
pRecvBuff = pFun->tpalloc(...);
if (pRecvBuff == NULL)
{
pFun->tpfree(pSendBuff);
return ERR_TUXEDO;
}
try
{
iRet = pFun->Fchg32(...);
if (iRet == -1)
{
throw(1);
}
//建立连接
iRet = pFun->tpinit(NULL);
if (iRet == -1)
{
throw(2);
}
iRet = pFun->tpcall(...);
if (iRet == -1)
{
throw(3);
}
iRet = pFun->tpterm();
if (iRet == -1)
{
throw(4);
}
iRet =pFun->Fget32(...);
if (iRet == -1)
{
throw(4);
}
pFun->tpfree(pSendBuff);
pFun->tpfree(pRecvBuff);
}
catch(int Err)
{
pFun->tpfree(pSendBuff);
pFun->tpfree(pRecvBuff);
return Err;
}
catch(...)
{
return ERR_UNKNOWN;
}
//这里可以处理接收到的数据结果
//...
6、编译。
包中一定的动态库中。下面以
tpinit,tpcall,tpterm,tpfree,tpalloc,Fget32,Fchg32,FLDOCC32 几个函数为
例介绍一下在该子集下的编程方式。(不是很准哟)
1、首先 找到这些函数所在的动态库。经过解析发现以上函数包含
在"wtuxws32.dll","libfml32.dll" 两个动态库中。多好,有了这两个动
态库,应用程序发行时,带上他们就可以了。再也不会出现 操作系统弹出
的动态库定位错误了。 且慢,后经研究发现,光有这两个dll不行,他们
的运行还需如下6个dll:libbuft.dll,libengine.dll,libfml.dll,
libgpnet.dll,libtux.dll,libwsc.dll。 哈哈。总算解析完了。
好,把这些文件copy出来到自己的工程目录下。多棒。赶紧进入下一步。
2、配置编译环境。这很重要。为使大家编程方便,我们做些小动作。在
BCB 的安装目录下(即$(BCB)标识的目录)建立tuxedo\目录,将
tuxedo开发包中的 \bin\,\include\,\lib\几个目录拷贝到该目录下。
然后,在Option|Directories/Conditionals中设置
Include Path : $(BCB)\Tuxedo\include
Library Path : $(BCB)\Tuxedo\lib
好了,环境设置好了。在你的工程中include :
#include <atmi.h>
#include <fml32.h>
#include <tmenv.h>
哦,他们三个文件实在太重要了,不包含进来你会后悔的:)
3、建立一个tuxedo子集函数结构。为什么这样做呢,直接使用tuxedo函数
不好吗? 这没什么的,依个人编程环境而定。我习惯于在结构名下
使用这些 外来开发包中的函数,因为你对他们不是很熟,有时会遗忘
其名称,将其放在结构中,利用BCB自动提示功能,你就可以很容易
找到(想起)需要的函数了。我定义的结构如下:
typedef
struct _FunTuxedo
{
int
(_TMDLLENTRY *
tpcall)(char _TM_FAR *,
char _TM_FAR *,
long ,
char _TM_FAR * _TM_FAR *,
long _TM_FAR *,
long );
int
(_TMDLLENTRY *
tpinit)(TPINIT _TM_FAR *);
int
(_TMDLLENTRY *
tpterm)(void);
void
(_TMDLLENTRY *
tpfree)(char _TM_FAR *);
char *
(_TMDLLENTRY *
tpalloc)(char _TM_FAR *,
char _TM_FAR *,
long);
int
(_TMDLLENTRY *
Fget32)(FBFR32 _TM_FAR *,
FLDID32,
FLDOCC32,
char _TM_FAR *,
FLDLEN32 _TM_FAR *);
int
(_TMDLLENTRY *
Fchg32)(FBFR32 _TM_FAR *,
FLDID32,
FLDOCC32,
char _TM_FAR *,
FLDLEN32);
FLDOCC32
(_TMDLLENTRY *
Foccur32)( FBFR32 _TM_FAR *,
FLDID32);
HMODULE hLibfml32; // libfml32.dll 动态库句柄
HMODULE hWtuxws32; // wtuxws32.dll 动态库句柄
}FUNTUXEDO,*PFUNTUXEDO;
这里,我将两个动态库句柄加入到了结构中,是因为我打算动态使用
tuxedo中间件。方便我释放他们。,下一节介绍装载/释放他们
4 装载、释放中间件(基于FUNTUXEDO结构)
哈,这很容易,主要用到LoadLibrary,FreeLibrary,GetProcAddress
三个函数。装载代码如下:
PFUNTUXEDO pFun;
//Loading Fchg32, Fget32 by LIBFML32.DLL
pFun->hLibfml32 = LoadLibrary("libfml32.dll");
if (pFun->hLibfml32 == NULL)
{
return -1;
}
(FARPROC &)pFun->Fchg32
=(FARPROC)GetProcAddress(pFun->hLibfml32,"Fchg32");
(FARPROC &)pFun->Fget32
=(FARPROC)GetProcAddress(pFun->hLibfml32,"Fget32");
(FARPROC &)pFun->Foccur32
=(FARPROC)GetProcAddress(pFun->hLibfml32,"Foccur32");
if (pFun->Fchg32 == NULL || pFun->Fget32 == NULL || pFun->Foccur32 == NULL)
{
FreeLibrary(pFun->hLibfml32);
pFun->hLibfml32 = NULL;
return -2;
}
//Loading tpacall, tpalloc, tpfree, tpinit, tpterm by WTUXWS32.DLL
pFun->hWtuxws32 = LoadLibrary("wtuxws32.dll");
if (pFun->hWtuxws32 == NULL)
{
FreeLibrary(pFun->hLibfml32);
pFun->hLibfml32 = NULL;
return -3;
}
(FARPROC &)pFun->tpcall
=(FARPROC)GetProcAddress(pFun->hWtuxws32,"tpacall");
(FARPROC &)pFun->tpalloc
=(FARPROC)GetProcAddress(pFun->hWtuxws32,"tpalloc");
(FARPROC &)pFun->tpfree
=(FARPROC)GetProcAddress(pFun->hWtuxws32,"tpfree");
(FARPROC &)pFun->tpinit
=(FARPROC)GetProcAddress(pFun->hWtuxws32,"tpinit");
(FARPROC &)pFun->tpterm
=(FARPROC)GetProcAddress(pFun->hWtuxws32,"tpterm");
if (pFun->tpcall == NULL || pFun->tpalloc == NULL ||
pFun->tpfree == NULL || pFun->tpinit == NULL ||
pFun->tpterm == NULL)
{
FreeLibrary(pFun->hLibfml32);
pFun->hLibfml32 = NULL;
FreeLibrary(pFun->hWtuxws32);
pFun->hWtuxws32 = NULL;
return -4;
}
释放时很简单,只需
FreeLibrary(pFun->hLibfml32);
FreeLibrary(pFun->hWtuxws32);
即可。
5、使用。例:...的内容查帮助吧。
PFUNTUXEDO pFun;
char *pSendBuff;
char *pRecvBuff;
long lRet;
short sRet;
int iRet;
//中间件服务
pSendBuff = pFun->tpalloc(...);
if (pSendBuff == NULL)
{
return ERR_TUXEDO;
}
pRecvBuff = pFun->tpalloc(...);
if (pRecvBuff == NULL)
{
pFun->tpfree(pSendBuff);
return ERR_TUXEDO;
}
try
{
iRet = pFun->Fchg32(...);
if (iRet == -1)
{
throw(1);
}
//建立连接
iRet = pFun->tpinit(NULL);
if (iRet == -1)
{
throw(2);
}
iRet = pFun->tpcall(...);
if (iRet == -1)
{
throw(3);
}
iRet = pFun->tpterm();
if (iRet == -1)
{
throw(4);
}
iRet =pFun->Fget32(...);
if (iRet == -1)
{
throw(4);
}
pFun->tpfree(pSendBuff);
pFun->tpfree(pRecvBuff);
}
catch(int Err)
{
pFun->tpfree(pSendBuff);
pFun->tpfree(pRecvBuff);
return Err;
}
catch(...)
{
return ERR_UNKNOWN;
}
//这里可以处理接收到的数据结果
//...
6、编译。
最新更新
Objective-C语法之代码块(block)的使用
VB.NET eBook
Add-in and Automation Development In VB.NET 2003 (F
Add-in and Automation Development In VB.NET 2003 (8
Add-in and Automation Development in VB.NET 2003 (6
Add-in and Automation Development In VB.NET 2003 (5
AddIn Automation Development In VB.NET 2003 (4)
AddIn And Automation Development In VB.NET 2003 (2)
Addin and Automation Development In VB.NET 2003 (3)
AddIn And Automation Development In VB.NET 2003 (1)
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
SQL Server -- 解决存储过程传入参数作为s
武装你的WEBAPI-OData入门
武装你的WEBAPI-OData便捷查询
武装你的WEBAPI-OData分页查询
武装你的WEBAPI-OData资源更新Delta
5. 武装你的WEBAPI-OData使用Endpoint 05-09
武装你的WEBAPI-OData之API版本管理
武装你的WEBAPI-OData常见问题
武装你的WEBAPI-OData聚合查询
OData WebAPI实践-OData与EDM
OData WebAPI实践-Non-EDM模式