• <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++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

            BCB 客戶端 tuxedo 開發實例

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

            BCB 客戶端 tuxedo 開發實例
            -supermgr

            在BCB中怎樣使用tuxedo呢?

            本文給出了一個例子。

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

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

            這一問題咨詢過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)\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、編譯。

             

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

            后來發現的。

            2003-7

            97视频久久久| 精品999久久久久久中文字幕| 久久精品亚洲一区二区三区浴池 | 日本国产精品久久| 久久青青色综合| 久久AV高清无码| 久久av高潮av无码av喷吹| 精品国产乱码久久久久软件| 久久人做人爽一区二区三区| 国产精品久久久久影院色| 久久综合九色欧美综合狠狠| 久久久久亚洲AV无码麻豆| 青青青国产精品国产精品久久久久| 天天综合久久一二三区| 久久精品国产亚洲77777| 亚洲欧美成人久久综合中文网| 久久精品国产网红主播| 久久婷婷五月综合色奶水99啪| 日韩欧美亚洲综合久久影院d3| 久久精品免费全国观看国产| 精品久久一区二区三区| 五月丁香综合激情六月久久| 青青热久久国产久精品| 99久久精品无码一区二区毛片 | 亚洲伊人久久成综合人影院 | 一本色综合网久久| 久久久久久亚洲精品不卡 | 亚洲国产香蕉人人爽成AV片久久| 久久精品aⅴ无码中文字字幕不卡| 亚洲欧洲久久久精品| 久久天天躁狠狠躁夜夜av浪潮 | 观看 国产综合久久久久鬼色 欧美 亚洲 一区二区 | 久久精品国产亚洲精品2020| 要久久爱在线免费观看| 欧美粉嫩小泬久久久久久久 | 成人妇女免费播放久久久| 99久久精品国产一区二区| 亚洲午夜福利精品久久| 亚洲人AV永久一区二区三区久久| 久久无码精品一区二区三区| 久久人人爽人人澡人人高潮AV|