知新轩
温故而知新,可以为师矣.
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 ___ 阅读(1300) | 评论 (0)编辑 收藏
     摘要: 在struts2中,japserreport通过编写插件扩展"result-types"的形式实现了跟struts2的集成,本文将采用相同的集成方式,将Crystal Report与struts2集成.  阅读全文
posted @ 2008-02-23 22:21 ___ 阅读(886) | 评论 (0)编辑 收藏
框架为骨,应用为肉,架构为魂.
posted @ 2007-08-01 16:16 ___ 阅读(212) | 评论 (0)编辑 收藏
编码若禹王制水,宜疏不宜堵.
posted @ 2007-07-05 11:56 ___ 阅读(181) | 评论 (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 ___ 阅读(3159) | 评论 (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
   具体原因及详细信信息 http://mail.gnome.org/archives/xml/2004-February/msg00007.html
3,解析xml.
   这里,我们以解析内容如下的xml文件为例:
   "
   <?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.blogjava.net/Files/lixf/testlibxml.rar
      
  
   

posted @ 2005-12-07 11:40 ___ 阅读(1452) | 评论 (0)编辑 收藏
仅列出标题  

<2024年12月>
24252627282930
1234567
891011121314
15161718192021
22232425262728
2930311234

常用链接

留言簿(1)

随笔档案(6)

搜索

  •  

最新评论

阅读排行榜

评论排行榜