明輝手游網(wǎng)中心:是一個免費提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺!

BCB客戶端tuxedo開發(fā)案例

[摘要]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、編譯。