分享
 
 
 

BCB 客户端 tuxedo 开发实例

王朝other·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

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);

即可。

(注:传统情况下,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、编译。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有