2006年05月12日

    关于xml,多说无益,的确是一个好东西。它是一种可扩展的置标语言,关于xml和sgml以及html的区别和联系,相关的书籍太多了,我在这里也没啥资格废话。想说说自己在wince下做xml parser的一点想法。

    wince 5.0目前支持到微软的msxml 3.0(据说pc上有7.0的版本,我的电脑上只有6.0)。关于各个版本的区别差异,也不是一句话两句话的问题。只谈谈xml解析方法。

    xml解析有两个接口,DOM和SAX,DOM(Document Object Model),SAX(Simple Application interface for XML)。前者是最基本应用编程接口,后者提供了比较底层的接口,编程比较灵活。初学咋练,只研究DOM。据说DOM接口使用了COM的技术,是把一个xml文档,解释成一棵节点树。然后对这个树进行访问来处理节点上的信息,如属性和元素等等。

    为了解析一个xml文档,首先要创建一个document对象,也就是一个IXMLDOMDocument接口的实例。首先,为了使用COM对象,需要使用CoInitialize函数来初始化COM环境。需要注意的事,wince下,并不支持CoInitialize,而是CoInitializeEx,这个函数提供了一个额外的参数让用户选择多线程模式还是单线程模式。关于这两者的区别,目前我说不清楚,不过不是简单的字面的解释,编程中会有一点小问题。这里我选择了多线程模式。

CoInitializeEx(NULL,COINIT_MULTITHREADED)

建立document对象,使用CoCreateInstance函数,参数使用网上经典的几个参数,第一个是CLSID值,CLSID_DOMDocument,包含在objsafe.h中。接口类型选择IID_IXMLDOMDocument。关于这个函数的使用,往上有很多不同版本的文章,有的是用名字空间什么的,我这里没有用。

CoCreateInstance(CLSID_DOMDocument,NULL,CLSCTX_INPROC_SERVER,IID_IXMLDOMDocument,(void**)&pDoc)

建立了实例以后,调用这个接口的一个方法,load,(loadxml方法也可以加载一个xml文件,但是loadxml也可以加载文件的一个部分,更灵活一点),第一个参数是VARIANT,第二个参数是VARIANT_BOOL。这两个参数曾经弄得我很头痛,后者其实就是一个short,前者是一个无类型的变量,可以用任何类型赋值,究其根本,就是一个结构体,里面用union做的多种类型。在msdn中可以找到。想要说明的是,如果VARIANT表示一个字符串,字符串的类型是BSTR。网上有很多文章介绍到这里关于字符串的处理,有的用到MFC的CString,有的用到了ATL的CComVariant,为了不用这些乱七八糟的东西(主要是重新配置wince image来支持这些东西有点麻烦,一个DocList的DLL找不到,如果有人可以告诉这个dll怎么搞定,不圣感谢),我用了下面的比较简单的方法。

   VARIANT vFile ;
   vFile.vt = VT_BSTR ;
   vFile.bstrVal = SysAllocString(L"\\release\\a.xml");
   VARIANT_BOOL vBool;
   pDoc->load(vFile,&vBool);

    这样,就得到了这个XML文件的根节点,接下来处理节点信息就简单了。

    除了IXMLDOMDocument接口,比较常用的还有IXMLDOMNodeList,IXMLDOMNode,IXMLDOMElement这几个接口,今天不想写太多关于这些接口的方法和属性了,列出一个简单的小程序,里面用一个小堆栈,实现了对XML树结点的遍历。

#include "stdafx.h"
#include "objsafe.h"
#include "Msxml2.h"
#include "Objbase.h"
#include "comutil.h"

typedef struct _node{
 IXMLDOMNode *Node;
 int level;
}nodes;

nodes NodeStack[100];
int top=0;

void pushStack(nodes node)
{
 NodeStack[top].Node = node.Node;
    NodeStack[top].level = node.level;
 top++;
}

void popStack(nodes * node)
{
 top--;
 (*node).Node = NodeStack[top].Node;
    (*node).level = NodeStack[top].level;
}

int isStackEmpty()
{
 if(top==0) return 1;
 else return 0;
}
int WINAPI WinMain( HINSTANCE hInstance,
     HINSTANCE hPrevInstance,
     LPTSTR    lpCmdLine,
     int       nCmdShow)
{
  IXMLDOMDocument *pDoc = NULL;
 IXMLDOMNodeList *pNodelist = NULL;
 IXMLDOMNode *pNode = NULL;
 IXMLDOMElement *pRootElement = NULL;
 nodes curNode;
 if(SUCCEEDED(CoInitializeEx(NULL,COINIT_MULTITHREADED)))
 {
  if(SUCCEEDED(CoCreateInstance(CLSID_DOMDocument,NULL,CLSCTX_INPROC_SERVER,IID_IXMLDOMDocument,(void**)&pDoc)))
  {
   VARIANT vFile ;
   vFile.vt = VT_BSTR ;
   vFile.bstrVal = SysAllocString(L"\\release\\a.xml");
   VARIANT_BOOL vBool;
   pDoc->load(vFile,&vBool);
   if(vBool != VARIANT_TRUE)
   {
    printf("not load");
    return 1;
   }
   else printf("load");
   /////////////////////////
   HRESULT hr;  
   hr = pDoc->get_documentElement(&pRootElement);
   if(SUCCEEDED(hr))
   {
    hr = pRootElement->QueryInterface(IID_IXMLDOMNode,(void**)&pNode);
    if(SUCCEEDED(hr))
    {
     BSTR bsxml;
     curNode.Node = pNode;
     curNode.level = 1;
     pushStack(curNode);
     int curLevel;
     while(1)
     {
      if(isStackEmpty()) break;
      popStack(&curNode);
      pNode = curNode.Node;
      curLevel = curNode.level;
      pNode->hasChildNodes(&vBool);
      if(vBool == VARIANT_TRUE)
      {
       hr = pNode->get_nodeName(&bsxml);
       if(SUCCEEDED(hr))
       {
        wprintf(L"%d,%s",curLevel,bsxml);
       }
       long value;
       pNode->get_childNodes(&pNodelist);
       pNode->Release();
       pNodelist->get_length(&value);
       for(int i=value-1;i>=0;i--)
       {
        pNodelist->get_item(i,&pNode);
        curNode.Node = pNode;
        curNode.level = curLevel+1;
        pushStack(curNode);
        //printf("top:%d",top);
       }
       pNodelist->Release();
      }
      else pNode->Release();
     }
    }
   }
   //////////////////////////
   pDoc->Release();
    
  }
  else printf("not cocreatinstance");
  CoUninitialize(); 
  
 } 
 else printf("not CoInitializeEx");
 return 0;
}

   





    摘要: 其实这也是一个长期困扰我的问题,要不是最近在研究DOM,需要使用COM支持的一些字符类型,实在懒得研究这些东西。不过,收获始终是收获。本文引述《C++字符串完全指南 - Win32字符编码》中的部分内容。感谢作者。     (全文共6048字)——点击此处阅读全文


2006年05月10日


    摘要:

1、extern "C"

    用C++编写的程序中使用C语言编写的库函数的时候,在C++引用的头文件中,应该把库函数的声明写在extern "C" { }中。原因是,C和C++编译器对函数名称的处理方式不同,主要是C++中支持函数的重载,这样在编译器处理过的函数名中需要对参数和返回类型的体现。如果声明写在extern "C" { }中,那么编译器将会按照C的编译方式为这个函数命名,这样才可能在库中找到正确的函数。否则会出现错误:unresolved external .......

    需要注意的是,不同的编译器对同一语言的函数名称处理也不相同,这一点在交叉编译的时候我感觉得比较明显。

2、_cdecl和_stdcall

    其实两者是一个函数的调用约定,决定了函数参数的压栈顺序,由调用者还是被调用者把参数弹出栈,以及产生函数修饰名的方法。

 &nb    (全文共1219字)——点击此处阅读全文



2006年03月05日

局域网内共享资源,一直都不是很懂。今天为了解决VSS的权限设置问题,简单研究了一下,仍然不是特别懂,如果下面有地方写的不对,日后一定改正。

    首先是文件的共享。

    主要是权限的设置。对于NTFS文件系统上的文件或文件夹,如果在文件夹选项中取消简单文件共享的选项,就可以对文件夹进行比较复杂的权限控制管理。在共享的权限上,取消everyone的权限,添加需要的用户或者是组。然后在安全TAB中添加用户的权限。

    在本地安全策略中,修改本地策略-〉安全选项,修改“网络访问:本地帐户的共享和安全模式”为“经典:本地用户以自己的身份验证”

    远程访问。

    访问方式有三种:网上邻居,unc,和磁盘映射。

    网上邻居可以通过工作组找到共享的资源,UNC是指在 地址栏中键入\\server\\share,磁盘映射可以在“我的电脑”上单击右键,键入共享目录的UNC,还可以选择以“其他用户名”登陆。

    如果远程资源不能够被everyone访问,就像上面的设置,那么当用前两种方法的时候会有提示对话框要求输入用户名和密码,但是不知道为什么我这里看不到对话框。有一个解决的办法是在控制面板-〉用户帐户,单击自己当前的用户,如果有管理员的权限,那么可以在左上角相关任务中看到“管理我的网络密码”,在里面添加一个server,并且设置访问该server的用户名和密码,这样以后访问这个server的资源的时候,默认的帐户就改成了刚刚输入的帐户。

    net use命令和net view命令。

    如果通过net use连接到服务器,或者通过资源管理器的窗口正确的访问过远程服务器的某一个文件夹,那么就可以用net view命令查看远程服务器的所有的共享文件。但是我不能确定这个第一次访问的帐户是不是必须有很高的权限。

    如果在共享文件夹的时候,在文件名后面加一个$,那么远端将无法看到这个文件夹出于共享状态,从而起到隐藏的目的。

   



2006年02月25日

    没想到真的会trace到这个blog来,如果不是真的很关心我的话。呵呵。

    说起导演,也许是我大学里面的遗憾,应该不会是一生的遗憾吧。因为我没有选择它成为我的职业,也没有选择在自己的大学生活里面,为自己做一点喜欢做的事请。

    我喜欢短剧和小品。这也是我在高中里自编自导自演短剧的原因和动力,即便那时的学习生活比现在要忙。自编,把自己的生活和看到的别人的融合在一起,在自以为了不起的灵感和激情碰撞的火花中自我陶醉;自导,享受身边支持你信任你的朋友的友谊,任意的发挥自己的想象力,用沟通和表达让每个演员了解自己的构思和想法,用他人的天赋弥补自己能力的不足,无限的延伸自己的power,完成独自一个人不可能完成的事情;自演,自我表现欲望的完美释放,即便有很多人不是很欣赏我的表演,也包括我自己。

    然而,喜欢做一件事并不代表可以做好它。就像有些人说过的,只有我的朋友们才会为我表演。的确,没有充分的文化素养和知识底蕴,没有好的导演;没有足够的交际手段和活动能力,没有好的导演;没有无限的容忍挫折的勇气,没有好的导演。这些素质我都不具备,于是我成不了一个导演,于是在大学里面我没有继续自己的爱好,于是有了我现在的遗憾和内心的不安。

    写了这些,应该算是对朋友,对自己的一个交代。

    话题稍转,刚刚看过电影《肖申克的救赎》,(其实早就想看一直很舍不得)。没有心灵的震撼,没有过多的言语的表达的欲望。联系到刚刚思考的做导演的话题,发挥一下,发现其实最好的导演和剧作家,不是扬名在外日进斗金的名家名流,而是为自己的人生剧本,演绎出最精彩的片断的人们。从这个角度来说,每个人都是自己的大导演,每个人都是电影里的主角,反过来,是不是只有自己才是自己主演的电影的最忠实的观众呢。





    摘要:

    以为几天以前来这里写过东西了,原来是做梦。大概是白天因为懒惰而不来更新blog,夜里愧疚难捱,于是发梦以便心安理得。

    刚和师兄聊了一会,也是他提醒我还有个blog,惭愧啊。这里面太杂太乱,倒是有些不好意思示人了。

    快一个月没有写过技术上的东西,倒不是应为这一个月里一点程序都没有写,保守点,几千行的代码总是有的,不过编程序真的是一件很垃圾的事情,如果没有什么技术上的新收获的话。

    总结一下,假期里为了补回丢失的软件设计大作业,把dentry的结构又作了深入一点的研究,基本明白了几个双向链表的关系,不过说实话,对于文件系统的理解,如果仅限于此,那就太坐井观天了。

    wince下的perfomence测试暂告一段落,完成代码是重要的,应该在一周多一点可以全部搞定。不过同时,应该好好研究一下wince下的嵌入式系统编程,毕竟dimanche里面我负责这一部分    (全文共860字)——点击此处阅读全文



2006年02月17日

    寒假不长,但是足以证明一些问题。

    好多期待着寒假做的事情,到头来由于种种原因全部落空;木然而逝的寒假生活中,又开始了新一轮的对未来生活的期待,似乎以为,一些事情只有在学校里才可以做,就像在学校里憧憬回家的充实生活;然而,日复一日的蹉跎,期待环境的改变来改变自己的心态,注定,没有改变的,只有自己的慵懒和不切实际。

 回到学校,开始了没有课程的学期。

    计划,似乎总是大于自己可以承受的范围。不喜欢学长说过的白天睡觉晚上疯狂的没课的日子,不等于说自己不想过猪的生活。给自己制定计划,总是冲动的。

    周末。

    没有工作和电影的周末,应该是另一种感觉。



2006年01月26日


    摘要:一直以为农历和阴历是一回事,其实有几点不同:     (全文共1058字)——点击此处阅读全文


2006年01月24日


    摘要:

1、回家的火车票,本来已经订到,结果有被订票处莫名其妙弄丢,还我白白排队取票到半夜两点。

2、回家路上遇到小偷,直接被偷成无产阶级。

3、好不容易写的代码没有备份,被虚拟机搞掉了。。。。。作业交不上了。。。。。。

    (全文共125字)——点击此处阅读全文




    摘要:

    将近一周的工作,鼠标一点化为乌有。

    天哪,谁设计的vmware的snapshot功能,天杀的!不就是想点save编程revert么,一周的工作全没了。昨晚编程到4点,结果。。。。。本以为今天可以交作业的。。。。。。。

    总结教训:

    别拿虚拟机当电脑用。

    不管是什么都要及时备份,否则有想哭的时候。

   

    (全文共299字)——点击此处阅读全文


2006年01月19日


    摘要:以为得到dentry很难,实际上就是比较麻烦。简单说两句。     (全文共611字)——点击此处阅读全文


2006年01月18日


    摘要:这两天收获还是挺大,一来wince下的多线程终于加深了理解,二来linux终于初涉内核编程,有了点小体会。linux内核的东西比较麻烦,有空再总结总结。今天抽空先写写wince的多线程协作。    (全文共1066字)——点击此处阅读全文




    摘要:不疼不痒得考完了OS,继续在寝室、教室和公司之间疲于奔命。生活一样麻木。但是,鉴于最近看了几集电视连续剧《武林外传》,生活终于多了一些调侃。不至于没日没夜死气沉沉,在代码和书本文字中堕落轮回。 这部电视剧,我是要赞一下的。原因主要有以下几点:     (全文共1109字)——点击此处阅读全文


2006年01月17日


    摘要: 有几个认识的朋友到这里来看我,赫赫。真开心。 先欢迎一下子,免得日后说我不好客。 解释一下,前一段时间在写程序,有了体会,就随便写一点,不要介意。有时间的话还是会写一些有意思的东西。featherlet也不要害怕到了什么黑客网站,呵呵,我还没那个水平。 好了,简单的欢迎,感谢关注。 不多说了,上班时间。。。。。。     (全文共283字)——点击此处阅读全文


2006年01月13日


    摘要: 写两句关于wince下多线程编程的体会。    (全文共1395字)——点击此处阅读全文