-
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、编译。
最新更新
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
Python初学者友好丨详解参数传递类型
如何有效管理爬虫流量?
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
SQL Server -- 解决存储过程传入参数作为s
JavaScript判断两个数组相等的四类方法
js如何操作video标签
React实战--利用甘特图和看板,强化Paas平
【记录】正则替换的偏方
前端下载 Blob 类型整理
抽象语法树AST必知必会
关于JS定时器的整理
JS中使用Promise.all控制所有的异步请求都完
js中字符串的方法
import-local执行流程与node模块路径解析流程