BCB 客戶端 tuxedo 開發例項 (轉)
tuxedo 的很多,所有應用都使用其中子集。這些函式子集包含在開發
包中一定的動態庫中。下面以
tpinit,tpcall,tpterm,tpfree,tpalloc,Fget32,Fchg32,FLDOCC32 幾個函式為
例介紹一下在該子集下的方式。(不是很準喲)
1、首先 找到這些函式所在的動態庫。經過解析發現以上函式包含
在"wtuxws32.dll","libfml32.dll" 兩個動態庫中。多好,有了這兩個動
態庫,應用發行時,帶上他們就可以了。再也不會出現 操作彈出
的動態庫定位錯誤了。 且慢,後經研究發現,光有這兩個dll不行,他們
的執行還需如下6個dll:libbuft.dll,libengine.dll,libfml.dll,
libg.dll,libtux.dll,libwsc.dll。 哈哈。總算解析完了。
好,把這些copy出來到自己的工程目錄下。多棒。趕緊進入下一步。
2、編譯環境。這很重要。為使大家程式設計方便,我們做些小動作。在
BCB 的目錄下(即$(BCB)標識的目錄)建立tuxedo目錄,將
tuxedo開發包中的 bin,include,lib幾個目錄複製到該目錄下。
然後,在Option|Directories/Conditionals中設定
Include Path : $(BCB)Tuxedoinclude
Library Path : $(BCB)Tuxedolib
好了,環境設定好了。在你的工程中include :
#include
#include
#include
哦,他們三個檔案實在太重要了,不包含進來你會後悔的:)
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;
}
(FROC &)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, tpteby 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 *pSenuff;
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、編譯。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752019/viewspace-982790/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- BCB 客戶端 tuxedo 開發例項客戶端UX
- Mqtt websocket javascript 客戶端例項MQQTWebJavaScript客戶端
- 遠端客戶端 訪問 ASM 例項客戶端ASM
- CouchBase C 客戶端介面呼叫例項客戶端
- ElasticSearch客戶端簡單操作例項Elasticsearch客戶端
- Nacos - 客戶端例項列表獲取客戶端
- 從客戶端連線ASM例項客戶端ASM
- 開發JAXR客戶端客戶端
- 叢集例項:配置ISCSI客戶端(LINUX)客戶端Linux
- easyui-table表格客戶端分頁例項UI客戶端
- 騰訊 客戶端開發 QT客戶端QT
- IE客戶客戶端程式開發的利器Bindows客戶端
- SHA-256加密簡單例項(客戶端、服務端)加密單例客戶端服務端
- iOS客戶端開發與Web前端開發iOS客戶端Web前端
- 使用 .NET MAUI 開發 ChatGPT 客戶端UIChatGPT客戶端
- OPC客戶端開發過程整理客戶端
- 開發WebApp之PC客戶端WebAPP客戶端
- 客戶端GUI程式開發漫談客戶端GUI
- ntp協議及客戶端開發協議客戶端
- [精華][推薦]CAS SSO單點登入服務端客戶端例項服務端客戶端
- binder通訊例項之c++客戶端與c++服務端C++客戶端服務端
- Flutter混合開發玩Android客戶端FlutterAndroid客戶端
- 青芒 for Mac客戶端開發筆記Mac客戶端筆記
- C++20協程例項:攜程化的IOCP服務端/客戶端C++服務端客戶端
- PHP-Socket服務端客戶端傳送接收通訊例項詳解PHP服務端客戶端
- 常用的Redis客戶端的併發模型(轉)Redis客戶端模型
- cvs客戶端大全(轉)客戶端
- 使用BindingX開發客戶端炫酷動畫客戶端動畫
- 用INDY9開發FTP客戶端_01FTP客戶端
- 富客戶端開發技術選型薦客戶端
- 網路開發基礎客戶端001客戶端
- 轉載|如何利用客戶端在itpub發部落格客戶端
- Java服務端和客戶端開發輔助工具UtilsJava服務端客戶端
- electron+vue 仿微信客戶端聊天|electron 仿微信介面|electron 聊天例項Vue客戶端
- javascript獲取客戶端ip地址省市和運營商程式碼例項JavaScript客戶端
- Java review--NIO例項:實現服務端和客戶端的簡單通訊JavaView服務端客戶端
- flutter開發的乾貨集中營客戶端Flutter客戶端
- Hyperledger fabric-SDK-GO客戶端開發篇(六)Go客戶端