• <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 閱讀(1317) 評論(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

            777久久精品一区二区三区无码| 亚洲va中文字幕无码久久不卡| 97久久精品午夜一区二区| 天堂久久天堂AV色综合| 国产精品久久久久jk制服| 青青青国产成人久久111网站| 久久久这里有精品中文字幕| 亚洲一区精品伊人久久伊人| 久久久av波多野一区二区| 欧美精品一本久久男人的天堂| 久久成人18免费网站| 久久99久久99精品免视看动漫| 久久99国产精品久久99果冻传媒| 亚洲国产香蕉人人爽成AV片久久 | 亚洲国产成人久久综合一| 久久精品国产黑森林| 国产成人精品久久| 国产精品岛国久久久久| 久久久久久国产精品无码下载 | 久久天天日天天操综合伊人av| 久久亚洲AV无码精品色午夜麻豆| 精品久久久久久国产潘金莲| 久久精品亚洲欧美日韩久久| 久久精品人人做人人爽电影蜜月 | 久久精品国产亚洲Aⅴ香蕉| 久久久久久亚洲精品成人 | 免费精品久久天干天干| 国产精品伦理久久久久久| 久久久久久久久无码精品亚洲日韩 | 狠狠色伊人久久精品综合网 | 观看 国产综合久久久久鬼色 欧美 亚洲 一区二区 | 久久久精品国产Sm最大网站| 国产精品久久成人影院| 久久久久99精品成人片欧美| 色综合久久久久久久久五月| 漂亮人妻被中出中文字幕久久 | 久久久久久久久久久精品尤物| 欧美亚洲日本久久精品| 久久久噜噜噜久久| 免费精品国产日韩热久久| 最新久久免费视频|