解決方案:
下載并安裝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) |
編輯 收藏
使用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) |
編輯 收藏