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)Tuxedoinclude
Library Path : $(BCB)Tuxedolib

好了,环境设置好了。在你的工程中include :
#include
#include
#include

哦,他们三个文件实在太重要了,不包含进来你会后悔的:)

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);
即可。

(注:传统情况下,FreeLibrary(DllHandle) 是不会出问题的。但在

BEA 公司 的 这些dll面前,ms 的 FreeLibrary 就不行了,当应用程序

退出时,会有非法地址访问的问题。我检查过数次,只要一经调用tpcall

,退出时就会有问题。)

折衷的办法是 使用 try-catch,释放时不使用FreeLibrary,

而在应用程序退出时,最后使用 FreeLibraryAndExitThread,否则即使

你使用FreeLibrary 也没法通过 catch 捕捉到异常。呵呵。



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、编译。

[@more@]

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/16396910/viewspace-1030809/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/16396910/viewspace-1030809/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值