BCB客戶端tuxedo開發(fā)案例
發(fā)表時間:2023-08-23 來源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]tuxedo 的函數(shù)很多,所有應(yīng)用都使用其中子集。這些函數(shù)子集包含在開發(fā)包中一定的動態(tài)庫中。下面以tpinit,tpcall,tpterm,tpfree,tpalloc,Fget32,Fchg32,...
tuxedo 的函數(shù)很多,所有應(yīng)用都使用其中子集。這些函數(shù)子集包含在開發(fā)
包中一定的動態(tài)庫中。下面以
tpinit,tpcall,tpterm,tpfree,tpalloc,Fget32,Fchg32,FLDOCC32 幾個函數(shù)為
例介紹一下在該子集下的編程方式。(不是很準(zhǔn)喲)
1、首先 找到這些函數(shù)所在的動態(tài)庫。經(jīng)過解析發(fā)現(xiàn)以上函數(shù)包含
在"wtuxws32.dll","libfml32.dll" 兩個動態(tài)庫中。多好,有了這兩個動
態(tài)庫,應(yīng)用程序發(fā)行時,帶上他們就可以了。再也不會出現(xiàn) 操作系統(tǒng)彈出
的動態(tài)庫定位錯誤了。 且慢,后經(jīng)研究發(fā)現(xiàn),光有這兩個dll不行,他們
的運行還需如下6個dll:libbuft.dll,libengine.dll,libfml.dll,
libgpnet.dll,libtux.dll,libwsc.dll。 哈哈。總算解析完了。
好,把這些文件copy出來到自己的工程目錄下。多棒。趕緊進入下一步。
2、配置編譯環(huán)境。這很重要。為使大家編程方便,我們做些小動作。在
BCB 的安裝目錄下(即$(BCB)標(biāo)識的目錄)建立tuxedo\目錄,將
tuxedo開發(fā)包中的 \bin\,\include\,\lib\幾個目錄拷貝到該目錄下。
然后,在Option Directories/Conditionals中設(shè)置
Include Path : $(BCB)\Tuxedo\include
Library Path : $(BCB)\Tuxedo\lib
好了,環(huán)境設(shè)置好了。在你的工程中include :
#include <atmi.h>
#include <fml32.h>
#include <tmenv.h>
哦,他們?nèi)齻文件實在太重要了,不包含進來你會后悔的:)
3、建立一個tuxedo子集函數(shù)結(jié)構(gòu)。為什么這樣做呢,直接使用tuxedo函數(shù)
不好嗎? 這沒什么的,依個人編程環(huán)境而定。我習(xí)慣于在結(jié)構(gòu)名下
使用這些 外來開發(fā)包中的函數(shù),因為你對他們不是很熟,有時會遺忘
其名稱,將其放在結(jié)構(gòu)中,利用BCB自動提示功能,你就可以很容易
找到(想起)需要的函數(shù)了。我定義的結(jié)構(gòu)如下:
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 動態(tài)庫句柄
HMODULE hWtuxws32; // wtuxws32.dll 動態(tài)庫句柄
}FUNTUXEDO,*PFUNTUXEDO;
這里,我將兩個動態(tài)庫句柄加入到了結(jié)構(gòu)中,是因為我打算動態(tài)使用
tuxedo中間件。方便我釋放他們。,下一節(jié)介紹裝載/釋放他們
4 裝載、釋放中間件(基于FUNTUXEDO結(jié)構(gòu))
哈,這很容易,主要用到LoadLibrary,FreeLibrary,GetProcAddress
三個函數(shù)。裝載代碼如下:
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、使用。例:...的內(nèi)容查幫助吧。
PFUNTUXEDO pFun;
char *pSendBuff;
char *pRecvBuff;
long lRet;
short sRet;
int iRet;
//中間件服務(wù)
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;
}
//這里可以處理接收到的數(shù)據(jù)結(jié)果
//...
6、編譯。