• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            Prayer

            在一般中尋求卓越
            posts - 1256, comments - 190, trackbacks - 0, articles - 0
              C++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

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

            Posted on 2008-12-11 15:07 Prayer 閱讀(1310) 評論(0)  編輯 收藏 引用 所屬分類: TUXEDO
             

            BCB 客戶端 tuxedo 開發(fā)實例
            -supermgr

            在BCB中怎樣使用tuxedo呢?

            本文給出了一個例子。

            然而,這個例子在后來被證明還是有點問題的,

            就是在tpcall調用后,無法釋放dll,而且會出錯。

            這一問題咨詢過tuxedo,多少年過去了,我還沒有

            得到問題的解。

             

            tuxedo 的函數(shù)很多,所有應用都使用其中子集。這些函數(shù)子集包含在開發(fā)

            包中一定的動態(tài)庫中。下面以

            tpinit,tpcall,tpterm,tpfree,tpalloc,Fget32,Fchg32,FLDOCC32 幾個函數(shù)為

            例介紹一下在該子集下的編程方式。(不是很準喲)

            1、首先 找到這些函數(shù)所在的動態(tài)庫。經(jīng)過解析發(fā)現(xiàn)以上函數(shù)包含        

                在wtuxws32.dll,libfml32.dll 兩個動態(tài)庫中。多好,有了這兩個動

               態(tài)庫,應用程序發(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)標識的目錄)建立tuxedo\目錄,將

               tuxedo開發(fā)包中的 \bin\,\include\,\lib\幾個目錄拷貝到該目錄下。
              
               然后,在Option|Directories/Conditionals中設置
              
                Include Path :   $(BCB)\Tuxedo\include
                Library Path :   $(BCB)\Tuxedo\lib
               
                好了,環(huán)境設置好了。在你的工程中include :
                #include <atmi.h>
                #include <fml32.h>
                #include <tmenv.h>
               
                哦,他們?nèi)齻€文件實在太重要了,不包含進來你會后悔的:)
               
            3、建立一個tuxedo子集函數(shù)結構。為什么這樣做呢,直接使用tuxedo函數(shù)

               不好嗎? 這沒什么的,依個人編程環(huán)境而定。我習慣于在結構名下
              
               使用這些 外來開發(fā)包中的函數(shù),因為你對他們不是很熟,有時會遺忘
              
               其名稱,將其放在結構中,利用BCB自動提示功能,你就可以很容易
              
               找到(想起)需要的函數(shù)了。我定義的結構如下:
              
             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)庫句柄加入到了結構中,是因為我打算動態(tài)使用
               
               tuxedo中間件。方便我釋放他們。,下一節(jié)介紹裝載/釋放他們
              
            4 裝載、釋放中間件(基于FUNTUXEDO結構)

               哈,這很容易,主要用到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);
               即可。

            (注:傳統(tǒng)情況下,F(xiàn)reeLibrary(DllHandle) 是不會出問題的。但在

            BEA 公司 的 這些dll面前,ms 的 FreeLibrary 就不行了,當應用程序

            退出時,會有非法地址訪問的問題。我檢查過數(shù)次,只要一經(jīng)調用tpcall

            ,退出時就會有問題。)

              折衷的辦法是 使用 try-catch,釋放時不使用FreeLibrary,

            而在應用程序退出時,最后使用 FreeLibraryAndExitThread,否則即使

            你使用FreeLibrary 也沒法通過 catch 捕捉到異常。呵呵。


               
             5、使用。例:...的內(nèi)容查幫助吧。
             
                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;
                }   

                //這里可以處理接收到的數(shù)據(jù)結果
                //...  
                 
            6、編譯。

             

            注意,這里有一個問題。當tpcall后,釋放dll時,有一點麻煩。

            后來發(fā)現(xiàn)的。

            2003-7

            亚洲va久久久噜噜噜久久天堂| 99麻豆久久久国产精品免费| 久久91精品国产91久久户| 伊人久久大香线焦AV综合影院 | 无码人妻少妇久久中文字幕| 国产精品久久久久9999高清| 久久精品午夜一区二区福利| 性做久久久久久久| 欧洲成人午夜精品无码区久久| 久久中文字幕人妻熟av女| 久久国产AVJUST麻豆| 久久99热这里只有精品66| 大蕉久久伊人中文字幕| 91麻豆精品国产91久久久久久| 2020最新久久久视精品爱| 日韩精品久久久久久| 免费无码国产欧美久久18| 波多野结衣中文字幕久久| 青青热久久综合网伊人| 亚洲一级Av无码毛片久久精品| 无码任你躁久久久久久老妇App| 91精品国产高清91久久久久久| 一级做a爰片久久毛片毛片| 色播久久人人爽人人爽人人片aV| 久久99精品国产| 久久久国产精华液| 久久久久亚洲精品天堂| 亚洲中文久久精品无码| 日韩AV无码久久一区二区| 久久久久久综合一区中文字幕| 久久99亚洲综合精品首页| 久久婷婷五月综合成人D啪| 久久婷婷五月综合色奶水99啪| 久久综合九色综合欧美狠狠| 久久亚洲精品无码观看不卡| 久久久久免费精品国产| 热久久国产精品| 午夜精品久久久久久中宇| 精品视频久久久久| 91精品国产综合久久精品| 亚洲欧洲久久久精品|