<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    知新軒
    溫故而知新,可以為師矣.
    posts - 7,  comments - 2,  trackbacks - 0
    解決方案:
    下載并安裝Microsoft Visual C++ 2005 SP1 Redistributable Package (x86)
    http://www.microsoft.com/downloads/thankyou.aspx?familyId=200b2fd9-ae1a-4a14-984d-389c36f85647&displayLang=zh-cn

    PS:
    一定得是SP1版本才行,裝過Microsoft Visual C++ 2005 Redistributable Package (x86),但是問題依舊。
    微軟的補丁做的很細很強大啊。
    posted @ 2008-05-26 13:48 ___ 閱讀(1311) | 評論 (0)編輯 收藏
         摘要: 在struts2中,japserreport通過編寫插件擴展"result-types"的形式實現了跟struts2的集成,本文將采用相同的集成方式,將Crystal Report與struts2集成.  閱讀全文
    posted @ 2008-02-23 22:21 ___ 閱讀(893) | 評論 (0)編輯 收藏
    框架為骨,應用為肉,架構為魂.
    posted @ 2007-08-01 16:16 ___ 閱讀(215) | 評論 (0)編輯 收藏
    編碼若禹王制水,宜疏不宜堵.
    posted @ 2007-07-05 11:56 ___ 閱讀(185) | 評論 (0)編輯 收藏

    使用gcc(win32)根據java導出的jini頭文件,編譯出的動態庫,無法被java正常的調用.而相同的頭文件,使用vc6編譯出的dll則可以.函數聲明如下:
    JNIEXPORT jint JNICALL Java_DataModule_VersionCtrl_CPP_1SrvVsn_1Depend
      (JNIEnv *, jobject, jstring, jint, jstring, jint, jint, jstring);
    其中:
    JNIEXPORT  在gcc和vc6的中都是定義為 __declspec(dllexport)
    JNICALL  在兩種編譯環境下也都是定義為 __stdcall
    觀察兩種環境下生成的dll,發現這兩個dll導出的函數名稱有所區別.
    一個是 (gcc)
    Java_DataModule_VersionCtrl_CPP_1SrvVsn_1Depend@32
    另一個是(vc6)
     _Java_DataModule_VersionCtrl_CPP_1SrvVsn_1Depend@32
    相差了一個下劃線!!
    難道是因為gcc編譯出的函數名稱與java預期的不一致,導致其在java中不能被正常的調用?于是,手動修改用于gcc編譯的jini頭文件中的函數聲明,在其原有名稱前加一個下劃線,使其與vc6的輸出的名稱一致,并相應修改函數定義中的函數名稱.重現編譯之,并再次于java中調用,竟然通過了.

    google搜索 __stdcall

    發現不同編譯器對__stdcall的實現是不同的,所以導致相同的聲明下,輸出函數名不一致.而java在win32平臺下默認是以微軟的vc6的編譯輸出格式為標準進行調用的.所以相同的頭文件vc6可以,而gcc不行,(bcb也不行)
    或許java有選項可以輸出兼容于其他編譯器的JNI頭文件吧.^_^.

    posted @ 2005-12-23 10:47 ___ 閱讀(3174) | 評論 (2)編輯 收藏

    1,編碼時需要包括頭文件:#include <libxml/globals.h>,編譯時需要鏈接 -lxml2 -lwsock32 的庫文件.
    2,xmlexports.h需要修改部分代碼才可以被正常連接,否則使用xmlfree函數時會報"_imp__xmlFree"的鏈接錯誤.
       修改代碼如下:
       將 #if defined(_WIN32) && defined(__MINGW32__) 代碼段,包括:
       #if defined(_WIN32) && defined(__MINGW32__)
      #undef XMLPUBFUN
      #undef XMLPUBVAR
      #undef XMLCALL
      #if defined(IN_LIBXML) && !defined(LIBXML_STATIC)
        #define XMLPUBFUN __declspec(dllexport)
        #define XMLPUBVAR __declspec(dllexport)
      #else
        #define XMLPUBFUN
        #if !defined(LIBXML_STATIC)
          #define XMLPUBVAR __declspec(dllimport) extern
        #else
          #define XMLPUBVAR extern
        #endif
      #endif
      #define XMLCALL __cdecl
      #if !defined _REENTRANT
        #define _REENTRANT
      #endif
    #endif
    注釋掉,然后在原有位置添上:
    #if defined(_WIN32) && defined(__MINGW32__)
       #define XMLPUBFUN
       #ifdef __cplusplus
         #define XMLPUBVAR extern
       #else
         #define XMLPUBVAR
       #endif
       #if !defined _REENTRANT
         #define _REENTRANT
       #endif
    #endif
       具體原因及詳細信信息    <?xml version="1.0" encoding="UTF-8"?>
       <NodeRoot ver = "000">
          <Node1 ver = "111">
                <Node2 ver = "222"/>
           </Node1>
           <Node3 ver = "333">
                 v3
           <Node3/>
       </NodeRoot>
       "
       首先,打開xml文件,使用:
       XMLPUBFUN xmlDocPtr XMLCALL   xmlParseFile  (const char *filename); (libxml/parser.h)
       獲得xml的根節點,使用:
       XMLPUBFUN xmlNodePtr XMLCALL xmlDocGetRootElement (xmlDocPtr doc);(libxml/tree.h)
       
       例:
      int ParseXMLFile(char *pXMLFileName)
       // retval:
       // 0 : Success
       // -1: Error ,for xml file open
       // -2: Error ,for xml file parse
       {
           int retval = 0;
           xmlDocPtr doc = NULL;
           xmlNodePtr cur = NULL;

           doc = xmlParseFile(pXMLFileName);
           if (doc == NULL ) 
           {
                 fprintf(stderr,"XMLParser:Document not parsed successfully. \n");
                 retval = -1;
                 goto ERROR_RET;
           }
           cur = xmlDocGetRootElement(doc);         // 會得到NodeRoot 節點.
           if (cur == NULL) 
           {
                 fprintf(stderr,"XMLParser:Empty document.\n");
                 retval = -2;
                 goto ERROR_RET;
           }


           //     ...  do something
           parsexml(doc,cur);         // 定義見下面.


        ERROR_RET:
           if(doc != NULL)
               xmlFreeDoc(doc);
           return retval;
        }
       其中,:
       結構xmlNodePtr 定義如下(libxml/tree.h):
        typedef struct _xmlNode xmlNode;
        typedef xmlNode *xmlNodePtr;
        struct _xmlNode {
        void           *_private; /* application data */
        xmlElementType   type; /* type number, must be second ! */
        const xmlChar   *name;      /* the name of the node, or the entity */ 
        struct _xmlNode *children; /* parent->childs link */
        struct _xmlNode *last; /* last child link */
        struct _xmlNode *parent; /* child->parent link */
        struct _xmlNode *next; /* next sibling link  */
        struct _xmlNode *prev; /* previous sibling link  */
        struct _xmlDoc  *doc; /* the containing document */

        /* End of common part */
        xmlNs           *ns;        /* pointer to the associated namespace */
        xmlChar         *content;   /* the content */
        struct _xmlAttr *properties;/* properties list */
        xmlNs           *nsDef;     /* namespace definitions on this node */
        void            *psvi; /* for type/PSVI informations */
        unsigned short   line; /* line number */
        unsigned short   extra; /* extra data for XPath/XSLT */
        };
        我們可以使用節點結構中的指針成員來遍歷xml樹中的各個節點.
        我一般使用遞歸的方式遍歷xml樹:
       int parsexml(xmlDocPtr doc, xmlNodePtr cur)
       {
           while (cur != NULL)
           {
              // do something about every node
               printf("name: %s\n",cur->name);
              {
                    //  for example,we get the "ver" attribute of every node
                    xmlChar *uri = NULL; 
                    uri = xmlGetProp(cur,(const xmlChar *) "ver"); 
                    if(uri != NULL)
                    {
                      printf("ver: %s\n", uri);
                       xmlFree(uri);
                    }
                    ;   // ... others

                 }
        
                 parsexml(doc,cur->xmlChildrenNode);
                 cur = cur->next;
              }
              return 0;
          }
         對于我們已經獲取的結點,我們可以使用以下函數獲取其各項屬性各項屬性:
          XMLPUBFUN xmlChar * XMLCALL xmlGetProp  (xmlNodePtr node,const xmlChar *name); (libxml/tree.h)
          獲得該節點的某項屬性,其中,屬性名稱使用 第二個參數name指定,第一個參數需要傳入結點指針.
          屬性的值通過函數返回傳出,返回類型是 xmlChar,這里注意,返回的地址是指向堆的,這意味著你需要
          在使用完畢后,手動釋放這塊內存.這里使用xmlfree函數,并將指針傳入即可.
          
          
          更多函數參見 libxml/tree.h

          最后,你需要調用xmlFreeDoc函數進行必要的釋放工作.
          
          完整代碼:
          
    http://www.tkk7.com/Files/lixf/testlibxml.rar
          
      
       

    posted @ 2005-12-07 11:40 ___ 閱讀(1464) | 評論 (0)編輯 收藏
    僅列出標題  

    <2025年5月>
    27282930123
    45678910
    11121314151617
    18192021222324
    25262728293031
    1234567

    常用鏈接

    留言簿(1)

    隨筆檔案(6)

    搜索

    •  

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 在线免费观看国产视频| 午夜私人影院免费体验区| 亚洲精品综合久久| 最新亚洲人成网站在线观看 | 中国一级特黄的片子免费| 亚洲高清视频一视频二视频三| 亚洲av无码一区二区三区人妖| 免费毛片在线播放| 国产综合成人亚洲区| 免费国产综合视频在线看| 美女视频免费看一区二区| 亚洲国产中文字幕在线观看| 深夜免费在线视频| 亚洲无线观看国产精品| 久久精品免费电影| 亚洲国产美女精品久久久久| 97国产免费全部免费观看| 国产精品亚洲专区在线观看| 成人奭片免费观看| 日本高清不卡中文字幕免费 | 久久精品7亚洲午夜a| 7m凹凸精品分类大全免费| 亚洲精品亚洲人成在线播放| 女人18毛片a级毛片免费| 黄色片网站在线免费观看| 亚洲国产另类久久久精品黑人 | 成年在线网站免费观看无广告| 亚洲AV成人无码网站| 自拍偷自拍亚洲精品第1页| 鲁大师在线影院免费观看| 亚洲日本va在线观看| jjzz亚洲亚洲女人| 免费视频精品一区二区三区 | 毛片基地看看成人免费| 久久久久亚洲AV无码麻豆| 成年男女男精品免费视频网站| 特级毛片全部免费播放| 亚洲成AV人片在线观看ww| 成人超污免费网站在线看| 三年在线观看免费观看完整版中文| 亚洲色图古典武侠|