月光软件站

您所在的位置:网站首页 fchg32函数 月光软件站

月光软件站

2024-04-20 08:48| 来源: 网络整理| 查看: 265

 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     #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;    }        (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、编译。

 



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3