taocoding


  • 首页

  • 关于

  • 标签

  • 分类

  • 归档

行为模式之Command

发表于 2009-10-19 | 分类于 设计模式

      “本来是打算看ThinkInC++上面的设计模式学习的,看到第二个模式也就是Command发现上面讲得实在是太少了,只好看那本经典的EBook了,幸好还算清晰,第一章看完一半就决定买一本纸质书了,犹豫了两天昨天晚上终于下单了,Head First 设计模式,明天估计就到货了,希望选择是对的。”

       刚刚把EBook上面的Commad一节看完,对这个模式有一点点体会了,但是由于没有在实际项目中用到也只能是纸上谈兵了,主要点就是将调用封装为对象,类似于函数对象吧,在调用和执行之间有个中介Command。涉及的主要参与者有Command-抽象类;CocreateCommand-具体的命令类;Client-应用程序,创建一个具体的命令并设置其接受者;Invoker-调用者,调用Command的接口;Receiver-接受者,执行具体命令类的请求,KoF说任何类都可以是Receiver,下面是KoF 的结构图:

序列图

 

下面是类图,Invoker和Command是聚合关系(包含但是不是必须),ConcreteCommand继承Command,Client和ConcreteCommand单向关联与Receiver,Client依赖于ConcreteCommand,即Client必须得ConcreteCommand才能完成工作

结构图

下面是KoF的简短实现:

class Command {
    public:
        virtual ~Command();

        virtual void Execute() = 0;
    protected:
        Command();
    };
class OpenCommand : public Command {
    public:
        OpenCommand(Application*);

        virtual void Execute();
    protected:
        virtual const char* AskUser();
    private:
        Application* _application;
        char* _response;
    };
OpenCommand::OpenCommand (Application* a) {
        _application = a;
    }

    void OpenCommand::Execute () {
        const char* name = AskUser();

        if (name != 0) {
            Document* document = new Document(name);
            _application->Add(document);
            document->Open();
        }
    }
class PasteCommand : public Command {
    public:
        PasteCommand(Document*);

        virtual void Execute();
    private:
        Document* _document;
    };

    PasteCommand::PasteCommand (Document* doc) {
        _document = doc;
    }

    void PasteCommand::Execute () {
        _document->Paste();
    }

对于简单的不需要参数和取消操作的Template版本:

template <class Receiver>
    class SimpleCommand : public Command {
    public:
        typedef void (Receiver::* Action)();

        SimpleCommand(Receiver* r, Action a) :
            _receiver(r), _action(a) { }

        virtual void Execute();
    private:
        Action _action;
        Receiver* _receiver;
    };
template <class Receiver>
    void SimpleCommand<Receiver>::Execute () {
        (_receiver->*_action)();
    }
MyClass* receiver = new MyClass;
    // ...
    Command* aCommand =
        new SimpleCommand<MyClass>(receiver, &MyClass::Action);
    // ...
    aCommand->Execute();

先贴上这么多,不知道哪一天会在项目中应用到,慢慢体会……

Singleton

发表于 2009-10-18 | 分类于 设计模式

      这个应该是最简单的一个设计模式,记得当初在学校学习C++时看到这样一个类,当时还觉得这确实是个技巧,但是那会基本上没有实际用到,这次在项目中则到处可见,个人觉得Singleton用到的场合还比较多,基本上叫做**Mgr之类的都是Singleton,当然经验还不足不知道是不是有些地方有滥用,我们项目中用到的是一个#define:

#define SINGLE_INSTANCE(class_name)  /

private: /

    class_name(); /

    class_name(const class_name&); /

    class_name& operator(const class_name&);/

public: /

     static class_name& instance() /

    {static class_name _instance;return _instance;}

这样假如定义了一个类:

class A

{

//这样就是一个Singleton类了

SINGLE_INSTANCE(A)

};

模板形式的更爽:

template<class T> class Singleton {

  Singleton(const Singleton&);

  Singleton& operator=(const Singleton&);

protected:

  Singleton() {}

  virtual ~Singleton() {}

public:

  static T& instance() {

    static T theInstance;

    return theInstance;

  }

};

 

// A sample class to be made into a Singleton

class MyClass : public Singleton<MyClass> {

  int x;

protected:

  friend class Singleton<MyClass>;

  MyClass() { x = 0; }

public:

  void setValue(int n) { x = n; }

  int getValue() const { return x; }

};

什么是设计模式

发表于 2009-10-16 | 分类于 设计模式

       Think In C++上面说,可以把模式的基本概念看做一般情况下程序设计的基本概念:增加一些抽象层(让我想到了沉思录上面经常说的一句话C++的惯用法用类来表示概念)。当人们对某事物进行抽象的时候,隔离特定的细节,最直接的动机之一就是为了变化的事物与不变的事物分离开。做到这一点的另一个方法是,一旦发现程序中的某些部分可能被修改,那么就要阻止那些修改在代码中到处传播副作用。

       设计模式的目标是封装变化。书中讲到这样就可以把继承和组合看做一种设计模式,但是由编程语言直接支持的特性不能被称为设计模式,毕竟设计模式应该是和语言无关的。

       设计模式的分类:1创建型:用于怎样创建一个对象,通常包括隔离对象创建的细节,这样代码不依赖于对象是什么类型,因此在增加一种新的对象类型时不需要改变代码。2结构型:影响对象之间的连接方式,确保系统的变化不需要改变对象间的连接。3行为型:在程序中处理具有特定操作类型的对象,这些对象封装要执行的操作过程,比如解释一种语言,遍历一个序列或者实现一个算法。

       今天就到这,明天开始学习每一个具体的模式。

HTTP协议之处理Cookie

发表于 2009-10-16 | 分类于 系统编程

“由于工作需要,最近在学习HTTP协议相关的一些知识,在登陆一个jsp网站时,POST过去的请求被拒绝了,通过抓包分析可以看到此网站需要设置Cookie,这里找打一篇文章写得很不错,只截抄了关于Cookie协议的一部分”

 

大多数的 Web 应用程序都要求维护某种会话状态,如用户购物车的内容。这种会话状态的保持很多情况下需要借助于Cookie或者Session的帮助。本文结合在线页面翻译 (Machine Translation System)项目中对于Cookie的处理方法,探讨一下如何在HTTP应用代理中正确处理Cookie的传递和管理问题。

读者定位为具有Java和Web开发经验的开发和设计人员。

读者可以学习到关于Cookie的工作原理和Cookie协议的细节,以及在一个HTTP应用代理的场景下Cookie的管理和处理思想,并可以直接使用文中的代码和思路,提高工作效率。

随着越来越多的系统移植到了Web上,HTTP协议具有了比以前更广泛的应用。不同的系统对WEB实现提出了不同的要求,基于HTTP协议的网络应用正趋于复杂化和多元化。很多应用需要把用户请求的页面进行处理后再返回给用户,比如页面关键字过滤,页面内容缓存、内容搜索、页面翻译等等。这些应用在实际效果上类似于一个HTTP应用代理:它们首先接受用户的请求,根据用户请求的URL去真正的目标服务器取回目标页面,再根据不同应用的要求做出相应处理后返回给用户。这样用户直接面对的就是这个HTTP应用代理,而通过它与其他页面进行交互。Cookie或Session技术的应用,解决了HTTP协议的一个问题 – 无法保持客户状态,因此它现在被广泛应用于各种Web站点中。上面提到的那些应用如果不能处理好Cookie和Session的传递、更新和废除等问题,就会极大的限制它们所能处理站点的范围,因此如何在HTTP应用代理中正确处理Cookie,成为一个必须解决的问题。本文结合在页面翻译(Machine Translation System)项目中对于Cookie的处理方法,探讨一下这方面的解决方案。

 

Machine Translation System(以下简称MTS)是一个在线实时页面翻译系统,为用户在线提供把英文页面翻译成其他9种语言的服务。用户通过向MTS系统提交一个类似下面的URL使用此服务,其中参数url指明了用户所需要翻译的目标地址,参数language指明了所需翻译成的目标语言,www.mts.com是假想中提供MTS服务的站点。

HTTP://www.mts.com/translate?url=http://www.ibm.com/&language=French

一个完整的MTS系统处理过程可以分解成以下几个步骤:

  • 用户向MTS提交合适的URL。 MTS在接到用户的请求后,解析出用户需要翻译的目标地址和目标语言,根据用户请求的目标地址,把请求转发到目标服务器。 MTS接受来自目标服务器的应答,包括页面信息和HTTP头信息。 MTS在确定得到正确的目标页面后,把页面内容送入WebSphere Translation Server进行翻译。 把翻译后的页面连同修改后的HTTP头信息提交给用户。

MTS逻辑图
MTS逻辑图

当然,这其中涉及到很多的应用处理。比如与各种HTTP/HTTPS站点建立联结、根据HTTP头信息进行页面跳转和错误处理、为始终保持用户在翻译模式下而对目标的HTML页面进行分析和修改,根据系统设置对某些DNT(Do Not Translate)的页面进行过滤和跳转,当然还有对Cookie的处理等等。其他问题跟这篇文章关联不大,我们重点讨论在这种情况下的Cookie处理。Cookie跟随目标服务器的HTTP头信息被MTS接收到,经过MTS整理之后发给客户端浏览器。MTS在接到下一次用户对同一个站点的翻译请求时,再把从客户端得到的Cookie发送给目标服务器。

在以上的场景中,MTS充当的作用类似于一种HTTP应用代理服务器,它代替用户取得目标页面,并在作出相应处理后再提交给用户。当然,这种代理服务器不需要用户修改浏览器的代理服务器参数或者网络配置,而只是简单的在浏览器的地址栏中输入一个MTS能够识别的URL即可。此篇文章也是在这样一个应用场景的基础上,展开对HTTP应用代理服务器如何处理Cookie的讨论。

问题的产生

在MTS系统中,目标服务器的Cookie在两个地方会产生问题。当MTS接收目标服务器应答的时候,Cookie随着HTTP头信息被MTS接收到的。这时候目标服务器认为MTS就是最终客户,因此它赋予了Cookie与目标服务器相符的属性。而如果MTS把这些Cookie原封不动的保存在HTTP头信息中,传给真正的最终用户的话,用户的浏览器会因为这些Cookie不合法而忽略它们。同理,当Cookie从浏览器端传回目标服务器的时候,也会遇到相同的问题。因此有必要对Cookie进行一些处理,以保证用户的浏览器能真正识别和利用这些Cookie。

但是为何用户浏览器无法识别从目标服务器传过来的原始Cookie呢?这是因为出于安全性的考虑,Cookie规范制定的时候对Cookie的产生和接受设置了一些严格的规范,不符合这些规范的Cookie,浏览器和服务器都将予以忽略。下面我们从Cookie规范入手进行介绍。

 

目前有以下几种Cookie规范:

  • Netscape cookie草案:是最早的cookie规范,基于rfc2109。尽管这个规范与rc2109有较大的差别,但是很多服务器都与之兼容。 rfc2109, 是w3c发布的第一个官方cookie规范。理论上讲,所有的服务器在处理cookie(版本1)时,都要遵循此规范。遗憾的是,这个规范太严格了,以致很多服务器不正确的实施了该规范或仍在使用Netscape规范。 rfc2965规范定义了cookie版本2,并说明了cookie版本1的不足。

rfc2965规范的使用,目前并不多。rfc2109规范相应要严格得多,在实际应用上,并不是所有的浏览器和Web服务器都严格遵守。因此相比较而言,Netscape cookie草案倒是一个比较简洁和被广泛支持的Cookie规范,因此我们在这里以Netscape cookie草案为基础进行讨论,对于其他两种规范,我们的讨论和代码具有相同的意义。关于Netscape cookie草案的细节,大家可以参照Netscape官方站点,这里我们列举一些和我们讨论有关的内容。

根据Netscape cookie草案的描述,Cookie 是Web 服务器向用户的浏览器发送的一段ASCII码文本。一旦收到Cookie,浏览器会把Cookie的信息片断以”名/值”对(name-value pairs)的形式储存保存在本地。这以后,每当向同一个Web 服务器请求一个新的文档时,Web 浏览器都会发送之站点以前存储在本地的Cookie。创建Cookie的最初目的是想让Web服务器能够通过多个HTTP请求追踪客户。有些复杂的网络应用需要在不同的网页之间保持一致,它们需要这种会话状态的保持能力。

浏览器与Web服务器通过HTTP协议进行通讯,而Cookie就是保存在HTTP协议的请求或者应答头部(在HTTP协议中,数据包括两部分,一部分是头部,由一些名值对构成,用来描述要被传输数据的一些信息。一部分是主体(body),是真正的数据(如HTML页面等))进行传送的。

在HTML文档被发送之前,Web服务器通过传送HTTP 包头中的Set-Cookie 消息把一个cookie 发送到用户的浏览器中。下面是一个遵循Netscape cookie草案的完整的Set-Cookie 头:








Set-Cookie:customer=huangxp; path=/foo; domain=.ibm.com;
expires= Wednesday, 19-OCT-05 23:12:40 GMT; [secure]

Set-Cookie的每个属性解释如下:

  • Customer=huangxp 一个”名称=值”对,把名称customer设置为值”huangxp”,这个属性在Cookie中必须有。 path=/foo 控制哪些访问能够触发cookie 的发送。如果没有指定path,cookie 会在所有对此站点的HTTP 传送时发送。如果path=/directory,只有访问/directory 下面的网页时,cookie才被发送。在这个例子中,用户在访问目录/foo下的内容时,浏览器将发送此cookie。如果指定了path,但是path与当前访问的url不符,则此cookie将被忽略。 domain=.ibm.com 指定cookie被发送到哪台计算机上。正常情况下,cookie只被送回最初向用户发送cookie 的计算机。在这个例子中,cookie 会被发送到任何在.ibm.com域中的主机。如果domain 被设为空,domain 就被设置为和提供cookie 的Web 服务器相同。如果domain不为空,并且它的值又和提供cookie的Web服务器域名不符,这个Cookie将被忽略。 expires= Wednesday, 19-OCT-05 23:12:40 GMT 指定cookie 失效的时间。如果没有指定失效时间,这个cookie 就不会被写入计算机的硬盘上,并且只持续到这次会话结束。 secure 如果secure 这个词被作为Set-Cookie 头的一部分,那么cookie 只能通过安全通道传输(目前即SSL通道)。否则,浏览器将忽略此Cookie。

一旦浏览器接收了cookie,这个cookie和对远端Web服务器的连续请求将一起被浏览器发送。例如 前一个cookie 被存入浏览器并且浏览器试图请求 URL http://www.ibm.com/foo/index.html 时,下面的HTTP 包头就被发送到远端的Web服务器。

GET /foo/index.html HTTP/1.0
Cookie:customer=huangxp

 

在了解了Cookie协议的一些基本内容之后,让我们看看一次典型的网络浏览过程中浏览器如何识别和处理Cookie:

  • 浏览器对于Web服务器应答包头中Cookie的操作步骤:
    1. 从Web服务器的应答包头中提取所有的cookie。
    2. 解析这些cookie的组成部分(名称,值,路径等等)。
    3. 判定主机是否允许设置这些cookie。允许的话,则把这些Cookie存储在本地。* 浏览器对Web服务器请求包头中所有的Cookie进行筛选的步骤:
    1. 根据请求的URL和本地存储cookie的属性,判断那些Cookie能被发送给Web服务器。
    2. 对于多个cookie,判定发送的顺序。
    3. 把需要发送的Cookie加入到请求HTTP包头中一起发送。

以上我们了解了在一个典型的浏览器与Web服务器交互的时候,Cookie的传递过程。下面我们将看到,如果在MTS代理网络浏览的过程中,不对Cookie进行修改,上面的Cookie传递过程将无法实现。

1. 假设用户希望把 http://www.ibm.com/foo/index.html 页面翻译成法文,应该使用如下的url对MTS发出请求

:

http://www.mts.com/translate?url=http://www.ibm.com/foo/index.html&language=French

2. MTS接收用户的请求,连接远程目标服务器 http://www.ibm.com/foo/index.html。目标服务器做出应答,返回HTTP头和HTML页面内容。其中,典型的HTTP头内容如下:








HTTP/1.1 200 OK
Date: Mon, 24 Oct 2005 06:54:41 GMT
Server: IBM_HTTP_Server
Cache-Control: no-cache
Content-Length: 19885
Connection: close
Set-Cookie:customer=huangxp; path=/foo; domain=.ibm.com;
expires= Wednesday, 19-OCT-05 23:12:40 GMT
Content-Type: text/html

3. MTS不对Set-Cookie后的内容作任何处理,直接把它加到用户浏览器的应答头上发送给浏览器。

4. 浏览器将从Set-Cookie中解析出domain和path的值,分别是.ibm.com和/foo,并与请求的url:http://www.mts.com/translate?url=http://www.ibm.com/foo/index.html&language=French进行比较。请求url的domain是www.mts.com,path是/,与Set-Cookie中的属性不符,所以浏览器将忽略此Cookie。

另外,在浏览器发送Cookie的时候也会遇到同样的问题,同样如上例,如果浏览器里本来已经存储了http://www.ibm.com/foo/的Cookie,但由于用户要通过MTS访问此站点,浏览器经不会把已经存储的Cookie上转到MTS中,MTS也就无法把之传递到http://ibm.com/foo/上。

基于上面Cookie规范的介绍和例证,我们能看出,浏览器在接受某一个站点的Cookie的时候,需要检查Cookie的参数domain、path、secure,看是否与当前的站点和URL相符,如果不符的话,就会忽略。另一方面。浏览器在上传Cookie的时候,也会根据当前所访问站点的属性,上传相关的Cookie,而其他的Cookie则不予上传。

至此,我们讨论了需要修改Cookie的根本原因在于Cookie规范的限制。

 

 

 

DIB数据转换为DDB

发表于 2009-10-12 | 分类于 VC

前段时间做视频拍照时,需要将接受到的视频数据进行拍照,由于传输过来的是原始的DIB数据,因此需要将其转换为DDB,经过查找MSDN得出如下片段,比较实用,留个记号

HDC hdc = ::GetDC(NULL);
HBITMAP hbmpFriend = NULL;

BITMAPINFO bmi; 
memset(&bmi,sizeof(BITMAPINFO),0);
bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); 
bmi.bmiHeader.biWidth = nwidth; 
bmi.bmiHeader.biHeight = nheight; 
bmi.bmiHeader.biPlanes =1; 
bmi.bmiHeader.biBitCount = 24; 

// If the bitmap is not compressed, set the BI_RGB flag. 
bmi.bmiHeader.biCompression = BI_RGB; 

// Compute the number of bytes in the array of color 
// indices and store the result in biSizeImage. 
// For Windows NT, the width must be DWORD aligned unless 
// the bitmap is RLE compressed. This example shows this. 
// For Windows 95/98/Me, the width must be WORD aligned unless the 
// bitmap is RLE compressed.
bmi.bmiHeader.biSizeImage = ((bmi.bmiHeader.biWidth * 24 +31) & ~31) /8
* bmi.bmiHeader.biHeight; 
// Set biClrImportant to 0, indicating that all of the 
// device colors are important. 
bmi.bmiHeader.biClrImportant = 0; 
bmi.bmiHeader.biXPelsPerMeter = 0;
bmi.bmiHeader.biYPelsPerMeter = 0;

hbmpFriend = ::CreateCompatibleBitmap(hdc,nwidth,nheight);

int nRetCopyLines = SetDIBits(hdc, (HBITMAP)hbmpFriend, 
0, nheight, (LPVOID)pRGB, (BITMAPINFO*)&bmi, DIB_RGB_COLORS);

if (hbmpFriend && nRetCopyLines)
{
//该干啥就干啥
}

::DeleteObject(hbmpFriend);
::ReleaseDC(NULL, hdc);

ClearCase一点心得

发表于 2009-10-11 | 分类于 软件工程

    使用这个工具快一年了,个人感觉是非常强大的,不知道还有没有更强大的,没怎么用过SVN之类的,以后有时间也多试试。

最近在一次误装VS SP后,导致CC与VS关联失效,但是当时也没意识到是什么导致的,以为是和服务器连接的问题,又把管理员搞来了,他看了半天也不知道是什么问题,结果又是我想起了由于装SP导致的,(其实之前也因为自己的一次恶搞导致CC比较工具出现问题,那次也是让管理员搞的,当时只记得是换了个比较工具,当时也是自己没想出是什么原因导致的,结果他过来也不知道是什么原因,尴尬之下又是我想起了自己的恶搞,哎每次都是别人到现场才想出来,看来自己独立思索的能力还得加强)。之后管理员说让我重装,我当时觉得这个太麻烦了,而且说不定View之类还得重建(理论上应该可以不用重建,但是想着就麻烦),后来他又说有个什么教程写不用重装,搞得很牛X的说等会让我拷贝一份,结果打开一看根本就是牛头不对马嘴,别人讲的是VSS和VS的关联,我估计他自己都没看过这”教程”,或者是看了也不  懂。   

      到了这份上我也不好再打找他来了,毕竟办公室还有那么多人,影响别人也不好,网上搜了半天也无果,不知道是什么激发了自己的灵感想到这类软件一般都是在安装过程中关联的,那么弄个修复安装不就OK了,于是关掉所有VS,找到相关程序,确实有个修复安装选项,点击,打开VS,O(∩_∩)O哈哈~,搞定了。

      但是当我更新程序后习惯性的Compare有改动的文件时,再次出现比较工具提示找不到路径,没办法只得硬着头皮找了,只怪自己上次没看他弄的啥比较工具,拿同事电脑上共享的CC文件夹比较,替换还是不行,这次网络算是帮了个大忙,具体步骤就不说了,看下面的链接

http://www-01.ibm.com/support/docview.wss?rs=984&uid=swg21256807

其中这个KDiff3比自带的那个强大而且开源,也可以单独使用相当不错。

社会保障卡

发表于 2009-10-07 | 分类于 生活轨迹

      社会保障卡是由劳动和社会保障部统一规划,由各地劳动保障部门面向社会发行,应用于劳动和社会保障各项业务领域的集成电路卡(IC卡)。其中,面向城镇从业人员、失业人员和离退休人员发放的称为社会保障(个人)卡,面向用人单位发放的称为社会保障(用人单位)卡。由于社会保障(个人)卡是目前劳动保障部有关卡规划和规范的重点,各地实际发放的也多集中于这一种卡,所以通常我们所说的社会保障卡,就是指社会保障(个人)卡。

  社会保障卡卡面和卡内均记载持卡人姓名、性别、公民身份号码等基本信息,卡内标识了持卡人的个人状态(就业、失业、退休、失业等),可以记录持卡人社会保险缴费情况、养老保险个人账户信息、医疗保险个人账户信息、职业资格和技能、就业经历、工伤及职业病伤残程度等。社会保障卡是劳动者在劳动保障领域办事的电子凭证。持卡人可以凭卡就医,进行医疗保险个人账户结算;可以凭卡办理养老保险事务;可以凭卡到相关部门办理求职登记和失业登记手续,申领失业保险金,申请参加就业培训;可以凭卡申请劳动能力鉴定和申领享受工伤保险待遇等。此外,社会保障卡还是握在劳动者手中开启与系统联络之门的钥匙,凭借这把钥匙,持卡人可以上网查询信息,将来还可以在网上办理有关劳动和社会保障事务。

  社会保障卡的全称是“中华人民共和国社会保障卡”。从这一名称的含义上讲,发放的对象是政府有关部门实施社会保障的人群;从其内容上讲,可以涉及有关个人社会保障的方方面面,既包括社会保险,也包括就业服务,一些地区的地方政府根据当地的管理需要,还将更多的社会管理事务也放入其中;从其涉及的地域上讲,这是全国范围内可以使用的IC卡,可以适应全国统一劳动力市场和社会保障系统联网的需要,适应人员流动的需求。

  要正确理解社会保障卡这一概念,还必须清楚社会保障卡与其他行业性IC卡,特别是同银行卡的关系。由于社会保障卡上存有的供持卡人在医院就医结算的“个人账户”,类似于银行卡的“电子钱包”,一些地区或厂商便采用银行卡的标准来设计社会保障卡。银行卡标准是针对银行卡应用而制订的规范,其文件存储格式、指令操作、安全管理等方面都是针对与金融有关的各种交易行为设计的。而劳动保障领域发放的IC卡主要是用于行政管理,其主要功能是对信息记录进行管理,与银行卡的功能有很大不同。社会保障卡中的“医疗保险个人账户”也同银行卡中的“电子钱包”有本质的区别,它记载的是个人账户中“帐”的情况,而不是真正的“钱”。持卡人将个人账户余额划到卡中之后,医疗保险机构仍然要对账户的使用负责,即使持卡人的卡丢失、损坏,只要挂失前个人账户上的资金未被他人冒用,便仍旧归持卡人所有,仍可以使用这部分账户进行医疗消费。而银行卡中的电子钱包一旦用户将钱圈存到卡中,这笔钱便同银行无任何关系,一旦卡丢失、损坏,其损失完全由持卡人承担。因此,医疗保险个人账户绝不能采用电子钱包的模式进行处理。还有些地方将社会保障应用和金融应用放到一张卡上,对此,是不提倡的,因为将商业性应用和管理性应用集于一卡,在管理上会造成许多弊端,会给持卡人和管理机构带来许多不便,甚至给持卡人造成损失。

 

原文链接:http://www.gov.cn/banshi/2005-07/18/content_15856.htm

VS2005向导生成的win32程序编译GDI+问题

发表于 2009-09-26 | 分类于 VC

昨天用VS2005向导生成的Win32程序,当向其中添加GDI+相关文件引用时会提示如下错误

 

1>f:/microsoft visual studio 8/vc/platformsdk/include/gdiplusimaging.h(67) : error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int
1>f:/microsoft visual studio 8/vc/platformsdk/include/gdiplusimaging.h(67) : error C2440: “初始化”: 无法从“const char [37]”转换为“int”
1>        没有使该转换得以执行的上下文
1>f:/microsoft visual studio 8/vc/platformsdk/include/gdiplusimaging.h(67) : error C2146: 语法错误 : 缺少“;”(在标识符“IImageBytes”的前面)
1>f:/microsoft visual studio 8/vc/platformsdk/include/gdiplusimaging.h(67) : error C2470: “IImageBytes”: 看起来像函数定义,但没有参数列表;跳过明显的函数体
1>f:/microsoft visual studio 8/vc/platformsdk/include/gdiplusimaging.h(67) : error C2059: 语法错误 : “public”
1>f:/microsoft visual studio 8/vc/platformsdk/include/gdiplusimaging.h(246) : error C2146: 语法错误 : 缺少“;”(在标识符“id”的前面)
1>f:/microsoft visual studio 8/vc/platformsdk/include/gdiplusimaging.h(246) : error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int
1>f:/microsoft visual studio 8/vc/platformsdk/include/gdiplusimaging.h(246) : error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int
1>f:/microsoft visual studio 8/vc/platformsdk/include/gdiplusheaders.h(384) : error C2061: 语法错误 : 标识符“IStream”
1>f:/microsoft visual studio 8/vc/platformsdk/include/gdiplusheaders.h(395) : error C2061: 语法错误 : 标识符“IStream”
1>f:/microsoft visual studio 8/vc/platformsdk/include/gdiplusheaders.h(405) : error C2061: 语法错误 : 标识符“IStream”
1>f:/microsoft visual studio 8/vc/platformsdk/include/gdiplusheaders.h(443) : error C2061: 语法错误 : 标识符“PROPID”
1>f:/microsoft visual studio 8/vc/platformsdk/include/gdiplusheaders.h(444) : error C2061: 语法错误 : 标识符“PROPID”
1>f:/microsoft visual studio 8/vc/platformsdk/include/gdiplusheaders.h(445) : error C2061: 语法错误 : 标识符“PROPID”
1>f:/microsoft visual studio 8/vc/platformsdk/include/gdiplusheaders.h(453) : error C2061: 语法错误 : 标识符“PROPID”
1>f:/microsoft visual studio 8/vc/platformsdk/include/gdiplusheaders.h(465) : error C2535: “Gdiplus::Image::Image(void)”: 已经定义或声明成员函数
1>        f:/microsoft visual studio 8/vc/platformsdk/include/gdiplusheaders.h(384) : 参见“Gdiplus::Image::Image”的声明
1>f:/microsoft visual studio 8/vc/platformsdk/include/gdiplusheaders.h(499) : error C2061: 语法错误 : 标识符“IStream”
1>f:/microsoft visual studio 8/vc/platformsdk/include/gdiplusheaders.h(510) : error C2061: 语法错误 : 标识符“IStream”
1>f:/microsoft visual studio 8/vc/platformsdk/include/gdiplusflat.h(1133) : error C2065: “IStream”: 未声明的标识符
1>f:/microsoft visual studio 8/vc/platformsdk/include/gdiplusflat.h(1133) : error C2065: “stream”: 未声明的标识符
1>f:/microsoft visual studio 8/vc/platformsdk/include/gdiplusflat.h(1133) : error C2065: “image”: 未声明的标识符
1>f:/microsoft visual studio 8/vc/platformsdk/include/gdiplusflat.h(1133) : error C2275: “Gdiplus::GpImage”: 将此类型用作表达式非法
1>        f:/microsoft visual studio 8/vc/platformsdk/include/gdiplusgpstubs.h(61) : 参见“Gdiplus::GpImage”的声明
1>f:/microsoft visual studio 8/vc/platformsdk/include/gdiplusflat.h(1133) : warning C4229: 使用了记时错误 : 忽略数据上的修饰符
1>f:/microsoft visual studio 8/vc/platformsdk/include/gdiplusflat.h(1133) : error C2078: 初始值设定项太多
1>f:/microsoft visual studio 8/vc/platformsdk/include/gdiplusflat.h(1139) : error C2275: “Gdiplus::GpImage”: 将此类型用作表达式非法
1>        f:/microsoft visual studio 8/vc/platformsdk/include/gdiplusgpstubs.h(61) : 参见“Gdiplus::GpImage”的声明
1>f:/microsoft visual studio 8/vc/platformsdk/include/gdiplusflat.h(1139) : warning C4229: 使用了记时错误 : 忽略数据上的修饰符
1>f:/microsoft visual studio 8/vc/platformsdk/include/gdiplusflat.h(1139) : error C2078: 初始值设定项太多
1>f:/microsoft visual studio 8/vc/platformsdk/include/gdiplusflat.h(1156) : error C2061: 语法错误 : 标识符“IStream”
1>f:/microsoft visual studio 8/vc/platformsdk/include/gdiplusflat.h(1244) : error C2061: 语法错误 : 标识符“PROPID”
1>f:/microsoft visual studio 8/vc/platformsdk/include/gdiplusflat.h(1247) : error C2061: 语法错误 : 标识符“PROPID”
1>f:/microsoft visual studio 8/vc/platformsdk/include/gdiplusflat.h(1250) : error C2061: 语法错误 : 标识符“PROPID”
1>f:/microsoft visual studio 8/vc/platformsdk/include/gdiplusflat.h(1262) : error C2061: 语法错误 : 标识符“PROPID”
1>f:/microsoft visual studio 8/vc/platformsdk/include/gdiplusflat.h(1275) : error C2065: “bitmap”: 未声明的标识符
1>f:/microsoft visual studio 8/vc/platformsdk/include/gdiplusflat.h(1275) : error C2275: “Gdiplus::GpBitmap”: 将此类型用作表达式非法
1>        f:/microsoft visual studio 8/vc/platformsdk/include/gdiplusgpstubs.h(62) : 参见“Gdiplus::GpBitmap”的声明
1>f:/microsoft visual studio 8/vc/platformsdk/include/gdiplusflat.h(1275) : warning C4229: 使用了记时错误 : 忽略数据上的修饰符
1>f:/microsoft visual studio 8/vc/platformsdk/include/gdiplusflat.h(1275) : error C2078: 初始值设定项太多
1>f:/microsoft visual studio 8/vc/platformsdk/include/gdiplusflat.h(1281) : error C2275: “Gdiplus::GpBitmap”: 将此类型用作表达式非法
1>        f:/microsoft visual studio 8/vc/platformsdk/include/gdiplusgpstubs.h(62) : 参见“Gdiplus::GpBitmap”的声明
1>f:/microsoft visual studio 8/vc/platformsdk/include/gdiplusflat.h(1281) : warning C4229: 使用了记时错误 : 忽略数据上的修饰符
1>f:/microsoft visual studio 8/vc/platformsdk/include/gdiplusflat.h(1281) : error C2078: 初始值设定项太多
1>f:/microsoft visual studio 8/vc/platformsdk/include/gdiplusflat.h(2128) : error C2065: “header”: 未声明的标识符
1>f:/microsoft visual studio 8/vc/platformsdk/include/gdiplusflat.h(2128) : error C2275: “Gdiplus::MetafileHeader”: 将此类型用作表达式非法
1>        f:/microsoft visual studio 8/vc/platformsdk/include/gdiplusmetaheader.h(112) : 参见“Gdiplus::MetafileHeader”的声明
1>f:/microsoft visual studio 8/vc/platformsdk/include/gdiplusflat.h(2128) : warning C4229: 使用了记时错误 : 忽略数据上的修饰符
1>f:/microsoft visual studio 8/vc/platformsdk/include/gdiplusflat.h(2128) : error C2078: 初始值设定项太多
1>f:/microsoft visual studio 8/vc/platformsdk/include/gdiplusflat.h(2146) : error C2061: 语法错误 : 标识符“IStream”
1>f:/microsoft visual studio 8/vc/platformsdk/include/gdiplusflat.h(2166) : error C2065: “metafile”: 未声明的标识符
1>f:/microsoft visual studio 8/vc/platformsdk/include/gdiplusflat.h(2166) : error C2275: “Gdiplus::GpMetafile”: 将此类型用作表达式非法
1>        f:/microsoft visual studio 8/vc/platformsdk/include/gdiplusgpstubs.h(63) : 参见“Gdiplus::GpMetafile”的声明
1>f:/microsoft visual studio 8/vc/platformsdk/include/gdiplusflat.h(2166) : warning C4229: 使用了记时错误 : 忽略数据上的修饰符
1>f:/microsoft visual studio 8/vc/platformsdk/include/gdiplusflat.h(2166) : error C2078: 初始值设定项太多
1>f:/microsoft visual studio 8/vc/platformsdk/include/gdiplusflat.h(2213) : error C2275: “HDC”: 将此类型用作表达式非法
1>        f:/microsoft visual studio 8/vc/platformsdk/include/windef.h(260) : 参见“HDC”的声明
1>f:/microsoft visual studio 8/vc/platformsdk/include/gdiplusflat.h(2213) : error C2146: 语法错误 : 缺少“)”(在标识符“referenceHdc”的前面)
1>f:/microsoft visual studio 8/vc/platformsdk/include/gdiplusflat.h(2213) : warning C4229: 使用了记时错误 : 忽略数据上的修饰符
1>f:/microsoft visual studio 8/vc/platformsdk/include/gdiplusflat.h(2213) : error C2078: 初始值设定项太多
1>f:/microsoft visual studio 8/vc/platformsdk/include/gdiplusflat.h(2213) : error C2275: “HDC”: 将此类型用作表达式非法
1>        f:/microsoft visual studio 8/vc/platformsdk/include/windef.h(260) : 参见“HDC”的声明
1>f:/microsoft visual studio 8/vc/platformsdk/include/gdiplusflat.h(2219) : error C2059: 语法错误 : “)”
1>f:/microsoft visual studio 8/vc/platformsdk/include/gdiplusflat.h(2224) : error C2275: “HDC”: 将此类型用作表达式非法
1>        f:/microsoft visual studio 8/vc/platformsdk/include/windef.h(260) : 参见“HDC”的声明
1>f:/microsoft visual studio 8/vc/platformsdk/include/gdiplusflat.h(2224) : error C2146: 语法错误 : 缺少“)”(在标识符“referenceHdc”的前面)
1>f:/microsoft visual studio 8/vc/platformsdk/include/gdiplusflat.h(2224) : warning C4229: 使用了记时错误 : 忽略数据上的修饰符
1>f:/microsoft visual studio 8/vc/platformsdk/include/gdiplusflat.h(2224) : error C2078: 初始值设定项太多
1>f:/microsoft visual studio 8/vc/platformsdk/include/gdiplusflat.h(2224) : error C2275: “HDC”: 将此类型用作表达式非法
1>        f:/microsoft visual studio 8/vc/platformsdk/include/windef.h(260) : 参见“HDC”的声明
1>f:/microsoft visual studio 8/vc/platformsdk/include/gdiplusflat.h(2230) : error C2059: 语法错误 : “)”
1>f:/microsoft visual studio 8/vc/platformsdk/include/gdipluspath.h(133) : error C2061: 语法错误 : 标识符“byte”
1>f:/microsoft visual studio 8/vc/platformsdk/include/gdiplusmetafile.h(80) : error C2061: 语法错误 : 标识符“IStream”
1>f:/microsoft visual studio 8/vc/platformsdk/include/gdiplusmetafile.h(197) : error C2061: 语法错误 : 标识符“IStream”
1>f:/microsoft visual studio 8/vc/platformsdk/include/gdiplusmetafile.h(197) : error C2535: “Gdiplus::Metafile::Metafile(void)”: 已经定义或声明成员函数
1>        f:/microsoft visual studio 8/vc/platformsdk/include/gdiplusmetafile.h(80) : 参见“Gdiplus::Metafile::Metafile”的声明
1>f:/microsoft visual studio 8/vc/platformsdk/include/gdiplusmetafile.h(213) : error C2061: 语法错误 : 标识符“IStream”
1>f:/microsoft visual studio 8/vc/platformsdk/include/gdiplusmetafile.h(213) : error C2535: “Gdiplus::Metafile::Metafile(void)”: 已经定义或声明成员函数
1>        f:/microsoft visual studio 8/vc/platformsdk/include/gdiplusmetafile.h(80) : 参见“Gdiplus::Metafile::Metafile”的声明
1>f:/microsoft visual studio 8/vc/platformsdk/include/gdiplusmetafile.h(231) : error C2061: 语法错误 : 标识符“IStream”
1>f:/microsoft visual studio 8/vc/platformsdk/include/gdiplusmetafile.h(231) : error C2535: “Gdiplus::Metafile::Metafile(void)”: 已经定义或声明成员函数
1>        f:/microsoft visual studio 8/vc/platformsdk/include/gdiplusmetafile.h(80) : 参见“Gdiplus::Metafile::Metafile”的声明
1>f:/microsoft visual studio 8/vc/platformsdk/include/gdiplusmetafile.h(277) : error C2061: 语法错误 : 标识符“IStream”
1>f:/microsoft visual studio 8/vc/platformsdk/include/gdiplusmetafile.h(370) : error C2535: “Gdiplus::Metafile::Metafile(void)”: 已经定义或声明成员函数
1>        f:/microsoft visual studio 8/vc/platformsdk/include/gdiplusmetafile.h(80) : 参见“Gdiplus::Metafile::Metafile”的声明
1>f:/microsoft visual studio 8/vc/platformsdk/include/gdiplusmetafile.h(207) : error C2065: “referenceHdc”: 未声明的标识符
1>f:/microsoft visual studio 8/vc/platformsdk/include/gdiplusmetafile.h(207) : error C2065: “type”: 未声明的标识符
1>f:/microsoft visual studio 8/vc/platformsdk/include/gdiplusmetafile.h(208) : error C2065: “description”: 未声明的标识符
1>f:/microsoft visual studio 8/vc/platformsdk/include/gdiplusmetafile.h(225) : error C2065: “frameRect”: 未声明的标识符
1>f:/microsoft visual studio 8/vc/platformsdk/include/gdiplusmetafile.h(225) : error C2065: “frameUnit”: 未声明的标识符
1>f:/microsoft visual studio 8/vc/platformsdk/include/gdiplusbitmap.h(45) : error C2275: “BOOL”: 将此类型用作表达式非法
1>        f:/microsoft visual studio 8/vc/platformsdk/include/windef.h(152) : 参见“BOOL”的声明
1>f:/microsoft visual studio 8/vc/platformsdk/include/gdiplusbitmap.h(45) : error C2146: 语法错误 : 缺少“)”(在标识符“useEmbeddedColorManagement”的前面)
1>f:/microsoft visual studio 8/vc/platformsdk/include/gdiplusbitmap.h(45) : error C2761: “{ctor}”: 不允许成员函数重新声明
1>f:/microsoft visual studio 8/vc/platformsdk/include/gdiplusbitmap.h(45) : error C2059: 语法错误 : “)”
1>f:/microsoft visual studio 8/vc/platformsdk/include/gdiplusbitmap.h(46) : error C2143: 语法错误 : 缺少“;”(在“{”的前面)
1>f:/microsoft visual studio 8/vc/platformsdk/include/gdiplusbitmap.h(46) : error C2447: “{”: 缺少函数标题(是否是老式的形式表?)
1>f:/microsoft visual studio 8/vc/platformsdk/include/gdiplusbitmap.h(80) : error C2275: “BOOL”: 将此类型用作表达式非法
1>        f:/microsoft visual studio 8/vc/platformsdk/include/windef.h(152) : 参见“BOOL”的声明
1>f:/microsoft visual studio 8/vc/platformsdk/include/gdiplusbitmap.h(80) : error C2146: 语法错误 : 缺少“)”(在标识符“useEmbeddedColorManagement”的前面)
1>f:/microsoft visual studio 8/vc/platformsdk/include/gdiplusbitmap.h(80) : error C2761: “Gdiplus::Image *Gdiplus::Image::FromStream(void)”: 不允许成员函数重新声明

 

但是自己新建一个空工程然后添加相关的文件就没问题,找了半天猜猜可能是StdAfx里面的宏有问题,试了几下发现然来是

#define WIN32_LEAN_AND_MEAN  // 从 Windows 头中排除极少使用的资料

这个定义导致的,去掉就OK了,没想到M$自己的东西都这样。

socket基础知识

发表于 2009-09-05 | 分类于 系统编程

      如果一个socket成功创建了,它存在于一个地址一个地址家族(socket函数的第一个参数即为地址家族),为什么要提供这个参数呢,因为Windows Sockets提供了一个与协议无关的编程接口,使得开发人员可以开发直接使用任何一种协议的网络程序。尽管如此,要实现网络通信定位和网络连接,为主机定址是必须得,bind函数就是干这个的。      另外在调用send/sendto时如果这是一个未绑定的socket,那么Windows Sockets会执行一个隐式的bind调用,系统会给其分配一个唯一值,并标记为绑定状态,可以通过getsockname 获取相关scoket name。因此在bind之前没有send/sendto之类操作,那么调用recv/recvfrom会得到10022的错误代码,即“提供了一个无效的参数”,也就是在socket没有绑定一个ip/port之前是不能接受数据的,联想到我们一般的C/S模式,S端都会先bind到一个ip/port,因为S是服务提供者,他不会主动发送数据,而是等待C来要求服务也就是发送数据,所以我们一般在C端不需要显示调用bind而是当send/sendto之类函数调用时,由系统绑定一个唯一的ip/port。对于S端我们一般都是指定一个固定的ip/port,而C端,MSDN上面的建议是最好让系统自动分配一个,可以在调用bind的时候可以将port设为0以免发生冲突。

 

 

调试MFC源代码

发表于 2009-09-01 | 分类于 VC

将C:/WINDOWS/system32下面的MFCXXXX.PDB拷贝到程序所在目录即可,以后就不会出现MFC42D.dll之类的Call Stack了,调试Modal对话框问题中偶然意识到的。

1…8910…16

billowqiu

157 日志
33 分类
10 标签
GitHub E-Mail
© 2020 billowqiu
由 Hexo 强力驱动
|
主题 — NexT.Pisces v5.1.3