MyMSDN

MyMSDN记录开发新知道

#

[翻译]关于“异步可插协议”(About Asynchronous Pluggable Protocols(APPs))

     摘要: [翻译]关于“异步可插协议”(About Asynchronous Pluggable Protocols(APPs))

原文链接:http://msdn2.microsoft.com/en-us/library/aa767916(VS.85).aspx
  阅读全文

posted @ 2008-03-28 02:21 volnet 阅读(1197) | 评论 (0)编辑 收藏

[学习笔记]C++ Primer[第二章]基本语言

Page 30 ( Chapter 2 基本语言)
算术类型的存储空间依机器而定。
Page 30 ( Chapter 2 基本语言)
表示整数、字符和布尔值的算术类型合称为整形(integral type)
字符类型有两种:char和wchar_t。char类型通常是单个机器字节(byte)。wchar_t类型用于扩展字符集,比如汉字和日语
Page 31 ( Chapter 2 基本语言)
在位这一级上,存储器是没有结构和意义的。
让存储具有结构的最基本方法是用块(chunk)处理存储。……虽然确切的大小因机器不同而不同,但是通常将8位的块作为一个字节,32位或4个字节作为一个“字(word)”
Page 32 ( Chapter 2 基本语言)
C++标准并未定义signed类型如何用位来表示,而是由每个编译器自由决定如何表示signed类型。……符号位为1,值就为负数;符号位为0,值就为0或正数。……有些语言中将负数赋给unsigned类型是非法的,但在C++中这是合法的。
Page 35 ( Chapter 2 基本语言)
为了兼容C语言,C++中所有的字符串字面值都由编译器自动在末尾添加一个空字符。
Page 36 ( Chapter 2 基本语言)
两个相邻的仅由空格、制表符或换行符分开的字符串字面值(或宽字符串字面值),可连接成一个新字符串字面值。
//concatenated long string literal
std::cout<<"a multi-line "
"string literal "
"using concatenation "
<<std::endl;
执行这条语句将会输出:
a multi-line string literal using concatenation
如果连接字符串字面值和宽字符串字面值,将会出现什么结果呢?例如:
//Concatenating plain and wide character strings is undefined
std::cout<<"multi-line" L"literal "<<std::endl;
其结果未定义的(unsigned),也就是说,连接不同类型的行为标准没有定义。这个程序可能会执行,也可能会崩溃或者产生没有用的值,而且在不同的编译器下程序的动作可能不同。
Page 36 ( Chapter 2 基本语言)
在一行的末尾加一反斜线符号可将此行和下一行当作同一行处理。
std::cou\
t<<"Hi"<<st\
d::endl;
等价于
std::cout<<"Hi"<<std::endl;
注意反斜线符号必须是该行的尾字符——不允许其后面有注释或空格。同样,后继行行首的任何空格和制表符都是字符串字面值的一部分。正因如此,长字符串字面值的后继行才不会有正常的缩进。
Page 39 ( Chapter 2 基本语言)
C++是一门静态类型语言,在编译时会作类型检查。
Page 41 ( Chapter 2 基本语言)
标识符不能包含两个连续的下划线,也不能以下划线开头后面紧跟一个大写字母。有些标识符(在函数外定义的标识符)不能以下划线开头。
Page 42 ( Chapter 2 基本语言)
C++支持两种初始化变量的形式:复制初始化(copy-initialization)和直接初始化(direct-initialization)。复制初始化语法用等号(=),直接初始化则是把初始化式放在括号中:
int ival(1024);    //direct-initialization
int ival = 1024;    //copy-initialization
Page 43 ( Chapter 2 基本语言)
也可以通过一个计数器和一个字符初始化string对象。这样创建的对象包含重复多次的指定字符,重复次数由计数器指定:
std::string all_nines(10,'9');    //all_nines="9999999999"
本例中,初始化all_nines的唯一方法是直接初始化。有多个初始化式时不能使用复制初始化
Page 44 ( Chapter 2 基本语言)
内置类型变量是否自动初始化取决于变量定义的位置。在函数体外定义的变量都初始化成0,在函数体里定义的内置类型变量不进行自动初始化。
Page 46 ( Chapter 2 基本语言)
extern声明不是定义,也不分配存储空间。
……
只有当extern声明位于函数外部时,才可以含有初始化式。
Page 50 ( Chapter 2 基本语言)
非const变量默认为extern,要使const变量能够在其他的文件中访问,必须显式地指定它为extern
Page 51 ( Chapter 2 基本语言)
引用只是对象的另一个名字
Page 52 ( Chapter 2 基本语言)
const引用可以初始化为不同类型的对象或者初始化为右值
……
非const引用只能绑定到与该引用同类型的对象。
const引用则可以绑定到不同但相关的类型的对象或绑定到右值。
Page 56-57 ( Chapter 2 基本语言)
如果使用class关键字来定义类,那么定义在第一个访问标号前的任何成员都隐式指定为private;如果使用struct关键字,那么这些成员都是public。使用class还是struct关键字来定义类,仅仅影响默认的初始化访问级别。
可以等效地定义Sales_item类为:
struct Sales_item{
    //no need for public label, memebers are public by default
    //operations on Sales_item objects
private:
    std::string isbn;
    unsigned units_sold;
    double revenues
};
本例的类定义和前面的类定义只有两个区别:这里使用了关键字struct,并且没有在花括号后使用关键字public。struct的成员都是public,除非有其他特殊的声明,所以就没有必要添加public标号。
用class和struct关键字定义类的唯一差别在于默认访问级别:默认情况下,struct的成员为public,而class的成员为private。
Page 59 ( Chapter 2 基本语言)
这种行为有一个很重要的含义:当我们在头文件中定义了const变量后,每个包含该头文件的源文件都有了自己的const变量,其名称和值都一样。

posted @ 2007-06-16 01:32 volnet 阅读(957) | 评论 (2)编辑 收藏

第一次直接用命令行的方式直接编译C++

其实也不是真正的第一次,以前有用csc进行编译.net的程序,可以算是第一次用cl编译吧。

今天读了C++ Primer,还是决定用这个最原始的方法来编译,感受一下历史的美,顺便对比一下今天大量IDE环境下的幸福的我们。

新开一个记事本,写下以下代码(好土的代码,温故而知新啦):

#include <iostream>
int main()
{
    std::cout<<"Enter two numbers:"<<std::endl;
    int v1,v2;
    std::cin>>v1>>v2;
    std::cout<<"The sum of " <<v1<<" and "<<v2<<" is "<<v1+v2<<std::endl;
    return 0;
}

保存为Unicode格式的prog1.cc(故意不用cpp,哈哈,天天用cpp给人感觉又是用VS创建的)

印象中以上代码的标准库似乎在VS2005创建的ConsoleApplication下已经无法编译了。

打开Visual Studio 2005 命令提示工具(开始->程序->“然后就是VS的那个快捷方式了”)

打开后就出现了命令提示窗口:(我的程序放在E盘底下的CPP文件夹内,命名为prog1.cc)

Setting environment for using Microsoft Visual Studio 2005 x86 tools.

D:\Program Files\Microsoft Visual Studio 8\VC>E:

E:\>cd cpp

E:\cpp>cl -EHsc prog1.cc
用于 80x86 的 Microsoft (R) 32 位 C/C++ 优化编译器 14.00.50727.762 版
版权所有(C) Microsoft Corporation。保留所有权利。

prog1.cc
Microsoft (R) Incremental Linker Version 8.00.50727.762
Copyright (C) Microsoft Corporation.  All rights reserved.

/out:prog1.exe
prog1.obj

E:\cpp>prog1
Enter two numbers:
3 7
The sum of 3 and 7 is 10

这时候进入文件夹也可以看到多了两个文件prog1.exe和prog1.obj

怎么样,有意思吧。呵呵,也不知道自己会坚持使用这种方法多久。呵呵!

posted @ 2007-06-09 19:46 volnet 阅读(1890) | 评论 (2)编辑 收藏

[学习笔记]C++ Primer[第一章]快速入门

[目的]

记录C++ Primer学习中遇到的需要记忆的东西,这里仅以我个人为标准进行记录。

[格式]

以下样例代表了本文所描述的所有摘要片段将通过以下模版进行创建。

Page [PageIndex] ( Chapter [ChapterIndex] [Title of Chapter])
[正文]

[正文]

Page 3 ( Chapter 1 快速入门)
      在大多数系统中,main函数的返回值是一个状态指示器。返回值0往往表示main函数成功执行完毕。任何其他非零的返回值都有操作系统定义的含义。通常非零返回值表明有错误出现。每一种操作系统都有自己的方式告诉用户main函数返回什么内容。
Page 3 ( Chapter 1 快速入门)

在书中提到的
C:\directory> cl -GX prog1.cpp
命令在利用VS2005所带的32位C/C++优化编译器下会出现如下提示:

用于 80x86 的 Microsoft (R) 32 位 C/C++ 优化编译器 14.00.50727.762 版
版权所有(C) Microsoft Corporation。保留所有权利。

cl: 命令行 warning D9035 :“GX”选项已否决,并将在将来的版本中移除
cl: 命令行 warning D9036 :使用“EHsc”而不使用“GX”

Page 5 ( Chapter 1 快速入门)
并没有直接定义进行输入或输出(IO)的任何语句,这种功能是由标准库提供的。
Page 6 ( Chapter 1 快速入门)
std::cout<<"Enter two number:"<<std::endl;
每个输出操作符实例都接受两个操作数:左操作数必须是ostream对象;右操作数是要输出的值。操作符将其右操作数写到作为其左操作数的ostream对象。
(std::cin与std::cout相反:
std::cout 左←右(注意箭头方向)
std::cin 左→右(注意箭头方向))
……
endl是一个特殊之,称为操纵符(manipulator),将它写入输出流时,具有输出换行的效果,并刷新与设备相关联的缓冲区(buffer)。通过刷新缓冲区,用户可立即看到写入到流中的输出。
Page 16 ( Chapter 1 快速入门)
当我们使用istream对象作为条件,结果是测试流的状态。如果流是有效的(也就是说,如果读入下一个输入是可能的)那么测试成功。遇到文件结束符(end-of-file)或遇到无效输入时,如读取了一个不是整数的值,则istream对象是无效的。处于无效状态的istream对象将导致条件失败。
【本信息针对上文中】
int sum = 0,value;
while(std::cin>>value)   //以前很少在while里面使用这样的输入
……
Page 20 ( Chapter 1 快速入门)
点操作符通过它的左操作数取得有操作数。点操作符仅应用于类类型的对象:左操作数必须是类类型的对象,右操作数必须指定该类型的成员。

posted @ 2007-06-09 17:29 volnet 阅读(1360) | 评论 (6)编辑 收藏

不尽的想法,不够的时间

今天收到当当网寄过来的C++ Primer感觉兴奋的同时又开始担心。

记得前两天写下学习计划这样的文章,将未来设计地如此“完美”,但今天拿到书后又一阵压力压得我喘不过气来,七百多页的书握在手上着实又厚实了许多,但给我带来的不是“踏实”的感觉,而是压力。当年在校可以一天窝在图书馆看书,800多页的书也就一页一页地啃下来了,前后也就两个月多,而且效率还挺高的。但现在看这本大部头就让我觉得压力,每天工作之余也挺累的,真不知道自己该如何坚持高效地完成这本书,其实在我看来,高效地看书比单纯意义上的看书是更值得关注的。

下面就我对高效看书做一个简要总结(针对计算机类书籍(非理论型)):

1、看书我习惯一次性看一大部分,比如说前后章节关联比较紧密的,我习惯性会坚持看完,连贯性的东西拆开看,通常会降低效率。而且我不是那种合上书本前说明天再看就一定会去看的人,因此为了不然自己接下去看的时候已经是下个月的这种情况发生,我都会坚持将一个部分看完。

2、建议在效率高的时候看书,看书切忌为了数量而不追求质量,有的时候可能你很困或者注意力很难集中,那切忌不要看,因为看了等于没看,而似乎又不愿意回头再看,这样将浪费那部分内容。

3、看书不提倡做小动作,之所以说不提倡是因为我将说“比如拿个笔晃来晃去”,因为这个习惯很多人都有,但是有的人受影响小,有的人则完全分心了。

4、看书一定要抓住重点多看几眼,以前看书经常看后不知所云,后来发现需要多关注重点,虽然不是每个字都要记住,但是重点部分一定要多看几眼,至于重点是什么,我想抱着求学的态度去认真看,重点不难找出。记得要多斟酌几遍,有什么可以随手记在边上。

5、看书要勤做练习,这点和计算机特别有关联,其实非常简单的代码,不去实践一下也是不容易记住的,哪怕只是抄到电脑上,或许你就会有新的发现。而且有的时候断点调试会有很多新的思路,对于自己在看书的时候有任何的疑问可以随手记录,比如你可以推算一段代码的某一处某个变量的值是否和你所预期的一样等等,其实这些都很容易就能够掌握,关键在一个“勤”字。

6、看书要多加思考,如果有个学习伙伴那就更好,可以互相交流,有的时候很明显的东西或许有有分歧的理解,这时候就是更需要证明的,证明自己往往要比自己看书更容易掌握,你不会告诉自己曾经某个时候你在某个地方对某个问题有深入的了解,但你一定会记得某个时候和伙伴为了一个细节争论正确,最后不管战况如何,你总是能记住那个被你求证过的结果,而不只是印象中的“似曾相识”。

7、看书一定要看好书,推荐到论坛上找找,总是有很多热心人曾今推荐过,那些被广泛支持的可以简单地称作“经典”,但切忌不要买了很多却每本只看第一章。

以上是我个人对看书的一点小小的心得。

本来想写一篇发泄压抑的文章,但写着写着就成了表达看书心得了,既然写了就发布上来,希望大家对我的看书心得给予评价。

希望未来一段时间我能坚持用自己总结的方法来按期完成任务。我现在在使用Gmail的日历来管理我的时间,希望这对我有益,也希望大家能够找个日历来管理自己的时间(Gmail,Hotmail,Yahoo等都有挺不错的日历管理功能,大家根据各自的需要选择吧)

有效管理时间,让未来过得充实而又充满丰收的喜悦。

posted @ 2007-06-08 19:41 volnet 阅读(328) | 评论 (3)编辑 收藏

【学习计划】C#与C++并行生存,为了设计,为了工作,为了生活,为了……

半年前的软件工程课程设计和SysClock是我C++的上一个句号。在学校的日子移情别恋于.net平台,本来想拓宽路子方便找工作,后来找到的工作就是做WebApplication的(.net),其实关注C#和.net已经有半年了,因此上手也还好,凭借着旧有的知识继续闯荡,不想争论C++还是C#好,但是因为很久没有在C++上有动作了,因此也就生疏了,而且从来也没有系统学习过C++,因此也就离他更远了。
毕业设计应该是大学阶段做过的最完整的software了,因为找到的工作是.net的,也就将C#熟能生巧到底了。C++的路子似乎已经被遗忘,过去还皮厚地在简历上写熟悉,现在也许只能写了解了。好在毕业设计我的重点不在于WEB本身,也不在于C#语法,而是强调设计思路,因此所有的重点从OOP开始,间或Design Pattern等知识,C#只是一个表现形式罢了。说老实话,.net下OOP确实比C++优美,更多地关注于设计细节让我对.net更有好感,微软确实能将简单融入开发,让复杂的事情简单化确实让人有更好的“用户体验”。
前阵子开始犹豫是不是要在C++方面继续挖掘?到了公司后想过离开,但是荒废了很多月的C++让我不争气,去了一家大公司面试后发现C++的基本功降低太多,题目简单到大二的时候都可以得心应手的地步,但是对一些底层的细节已经忘记了。不想和人争论自己曾经有多么优秀,只怪自己基本功不扎实。事情已经过去了四五个月,也没想太多,现在的工作虽然不是很有挑战性,但是薪酬也能够对得起良心,主要是它还很安逸,但是安逸给我的感觉总是有更多的不安,我习惯于充实的大脑才能够有说话的底气,但是我现在感觉有些力不从心了,还是想回到C++阵营上来,想过一段时间关于未来前景的问题,以前关注于社会变化,现在关心的是供需变化,.net搞垄断估计是迟早的事,但是做.net的人似乎也多的跟米一样,想过跑到JAVA阵营去混一片天地,但是已经逃离了语言主导的我已经不关心语言的选择了,我会投入更多的时间和精力在设计模式、系统架构、重构等一些所谓的方法论上,只有这样写出来的东西才能美,才会有灵魂,关注于语言层面毕竟还是过于低级了。但是语言是问题的表达形式,没有语言,那些方法论永远都是空想主意。C#确实能够满足我在设计方面的需求,这一点不容否认,而且工作需要,我不会放弃它,而且我会继续在上面不断表现我设计上的学习研究成果,我想这些基于经验的东西比基于技术的东西更加富有价值。但是整体方向的选择还是有一定必要的,前些日子想了一下,Windows的开发人太多了,竞争压力远比技术压力大,想过换平台,也许只有Unix有更好的企业市场,似乎能够瞄准电信行业而去,C++必然是这个方面的必需品。考虑过未来的中国市场和国际行情,嵌入式开发(更多的重点被我放在了手机平台的开发上),一切都才刚刚起步,至少国内是个步履蹒跚的地步,这个市场会需要很多的人才,C++应该仍然有强大的市场,虽然.net已经深入手机平台,所谓的跨平台还是基于平台的应用软件,虽然这方面的需求在未来一定很大,但是入门门槛并不高,Winform的朋友很容易就转过去,.net的跨平台性让大家都不失业,但是大家都没有高薪了,现在.net的工作应该也是一个转型的资本,我希望在底层方面有所拓展,因此C++仍然是必须。
C++与我的过去。过去还是喜欢所见即所得吧,毕竟拿底层入门有点浪费体力不讨好。学了N年的C语言,仍然只能用于大学的课程,C语言的知识其实很重要,但是现在却忘记地差不多了,很想把手头的那本C语言看一遍,当年期末复习通读也就两天不到,但是总是各种各样的原因阻碍了我的学习,或许我真的打心眼里不想看它吧。之后学习了VC++也是以MFC为核心进行展开,我用MFC又是喜欢于做一些应用软件,比如本文第一句话提到的两个家伙。其实现在要做应用软件,用.net一定更好,因为确实开发起来很方便,性能上并没有必要追求C++,不过说起来惭愧,我还是希望用我在Web上的工作经验去主导我在Winform的开发,毕竟Web比Winform更繁琐,业务逻辑和更底层我已经习惯于用类库来描述,因此Web和Win对我的差异就更小,我可以直接放弃表现层而仍然能够有所作为,至少我认为可以这么做。MFC是C++的经典,我想挖掘它更底层的东西,毕竟C++所能做的东西.net不一定能做。
昨天犹豫了很久还是决定从C++的语法开始系统的学习,用C++来表现设计我已经力不从心,我得让自己先有表达能力,然后才能抉择更多,以后是针对UNIX还是Embeded C++就得另作打算了,但是所有的核心不会变,更多地体现设计的理念,虽然将应用软件思想来对付底层开发或许不太可取,我想面向底层总不能没有设计吧?这些细节再做讨论。以后的日子无论C#还是C++一个都不能少一个也不会少,时间要充分地利用起来,付出才会有收获,我不想做只说不做的人。
昨晚到当当订购了两本书,一本是C++ Primer中文版(第4版)、重构-改善既有代码的设计,这两本书也是我现在最想品味的,曾几何时发现自己不是不爱看书,而是没有找到喜欢看的书,第一本将为我复习补充我曾经非系统地学习C++的知识,后一本将继续为我的设计创造新的动力。加油,不放弃,永不言败!

posted @ 2007-06-05 10:27 volnet 阅读(1559) | 评论 (9)编辑 收藏

[知识库][转载]十年MFC经历认识的Microsoft技术(ZT)

知识库(KnowledgeLibrary)  

固定链接http://www.cppblog.com/mymsdn/category/3173.html


文章标题:十年MFC经历认识的Microsoft技术(ZT)
关键字:MFC、Microsoft、技术对比、技术发展
转载自http://blog.vckbase.com/hangwire/archive/2005/05/26/5806.html
作者:hangwire
发表时间:2005-05-26 09:13


一、初识MFC

  我最初知道MFC大概是在1993年,那个时候Visual C++还没面世,当时Microsoft的C++编译器还很弱,官方的名字是Microsoft C/C++ 7.0,MFC的版本是1.0,几乎没有引起什么反响,那个时期最好的C++开发环境是Borland C++ 3.1,其实,大概是1992年11月份,一个偶然的机会,我领略到Borland公司的厉害,记不得在什么地方,我看到一个绝妙的集成开发环境,即Turbo C++ 3.0 for Windows,这是我记忆中第一个真正的Windows环境下的C++集成开发环境,那种激动的感觉至今仍记忆犹新,不客气的说,当时至少在C++方面,Microsoft与Borland不是一个水平的,Borland明显的要高于Microsoft ,Borland的产品在技术上给我留下深刻的印象。那个时候Microsoft最好的开发平台是Visual Basic 3.0,而Borland的Delphi正处于开发阶段(Delphi 的代码名称是:"VB Killer")……,想起这些十几年前的往事,我不禁感慨万千。

  十几年来,我用过许多开发环境,关于Visual Basic,我用过最早的DOS版本,Windows版的Visual Basic我基本上全都用过,至今我还记得每个版本的VB安装盘磁盘的盘数。同样,我用过各个版本的Delphi,特别是Delphi 2.0,给我留下极好的印象。Delphi提供真正编译的可视化开发环境,那个时候(1994年左右),Delphi就可以开发带有GUI的动态链接库,你可以想象,在Microsoft Access 2.0的应用程序中可以加载一个Delphi Form并进行程序交互,那种感觉真是棒极了。

  Borland C++是我心中无法抹掉的遗憾,从Turbo C到C++ Builder,我深刻的体验到Borland的辉煌和无奈,Delphi从VB Killer走到为VB护航(你可以想象Delphi一步到位的ActiveX 控件开发技术有多牛,早期的VB有多土,早期的VB不能开发动态链接库,因此无法开发ActiveX 控件,想起来真令人嘘唏不已),Borland C++的命运也是不济。Borland C++ 3.1的辉煌永远不再了,十几年的开发工作中,我在C++上投入了大量的精力,Borland C++曾经给我带来无数的激动,然而这个经典的名字却在与Microsoft的竞争中渐渐的流逝了……。

  MFC4.0的出现,使得人们感觉Microsoft在C++方面赶上来了,这一版的MFC是Win95推出后出现在Visual C++ 4中(Microsoft没有VC 3,VC4以前的版本是2.2、2.1、2.0、1.51、1.5、1.0)。也许是对Borland C++的潜意识的失望,我不知不觉的接受了MFC,VC 4.2推出时,我通过正常渠道购买了这个编译器的企业版。

二、关于Microsoft

  关于Microsoft,有无数的人要对这个名字叙说感觉,这个令人讨厌的名字!不知道是喜欢还是憎恶,你是程序员,你的心思可能就要因Microsoft的存在而动,即使你用Linux,你可能也是因为Microsoft技术因素。多少年来,这个名字每天都出现在你、我、他的面前,因为你不得不面对Windows的存在,可是你憎恨这个名字吗?你讨厌这个名字吗?我不知道是否已经对这个名字麻木了。

  1998年我个人订了Microsoft MSDN Universal 版,我开始比较全面接触这个公司的开发技术,你可以想象,1998年当你面对上百张技术光盘的时候,你就知道什么叫做"厚度",当我们有时说出"赶上"或 "达到"Microsoft某些产品的水平的时候,可能我们缺乏对这个公司"厚度"的真实了解。进入MSDN,我感觉Microsoft简直不是一个"公司",而是(或者正在形成)一个"社会"。

  当时著名的技术网站http://www.codeguru.com全部的技术资料是可下载的(那个时候http://www.codeguru.com提供整个网站内容下载服务,大约3M左右),大名鼎鼎的www.codeproject.com还不存在。一开始,我始终潜意识在技术上对比Microsoft与Borland,应当说技术上Borland不比Microsoft弱,即使现在也有人持有这个看法,可是为什么Borland走到今天这个地步?而Microsoft却如日中天?若干年前,这两个公司竞争何等激烈,而现在却是另一番"合作"的景象?可能很多人想过,如果Borland不存在,对Microsoft不是更有力吗?其实Microsoft可能精通中国历史,读过《三国》、十分了解战国时期的中国,其实Borland形式上的存在,对Microsoft是十分有利的,至少形式上还有竞争对手,而事实上Borland已经受控于Microsoft(Microsoft是Borland的大股东)。你可以看到一些微妙的现象:Borland为Microsoft提供了大量的人才,其中包括Delphi总设计师以及Borland C++编译器的核心成员;同时也为Microsoft .NET提供强有力的护航服务(看看C# Builder、Delphi .NET)。1998年Microsoft 的COM技术基本已经成熟,这个技术使人感到震撼,当时Microsoft的对手们提出"OpenDoc"用于对抗"COM",你看看"OpenDoc"阵营的几个成员:IBM、Apple、Borland、Novell,你会感到这个阵营十分豪华、强大。但结果却差强人意,"OpenDoc"无疾而终,而"COM"依然生机勃勃。

  有人说"COM"没落了,那么就太不了解Microsoft了。在与"OpenDoc"的竞争中,"COM"是个彻底的胜利者,在与"Java"的竞争中,"COM"成功的进化了,在这个过程中Microsoft体现了强大的吸收能力、以及无法想象的韧劲。.NET只不过是COM的"别名"而已。对于一个经验丰富的C++程序员而言,.NET就是COM的进化,而Microsoft内部.NET就是"COM 3.0"(OLE2就是COM 2.0),而"CLR"就是一个不择不扣的COM对象。曾经有人问我,既然牛顿时代就奠定了基础(想想著名的牛顿-莱布尼茨公式),几百年后的今天,数学还研究"微积分"吗?回答当然是依然在研究!"微积分"早期是针对函数的,现代"微积分"是针对"流形(Manifold)、纤维丛(Fiber Bundle)"的,概念深奥了,可是基本思想不变,只是"微积分"的思想得到合理的延拓与进化,你了解Microsoft吗?Microsoft Research有一批超一流的数学家在为Microsoft工作,其中一些是斐尔兹奖的得主,Microsoft正在实现如同"微积分"进化到"微分流形"一样将"COM"进化到".NET"。从科学概念角度上分析COM与Java,可能COM更全面、精确,从实现的成熟度上Java可能更成熟,可是你看到,Microsoft正在不紧不慢的追赶。Microsoft令人联想起战国时期的强秦。

  战国时期的秦国,采取"远交近攻""抚弱掠强"等措施傲视六国,今天的Microsoft也是这样,VB1.0时,Microsoft推出"VBX"控件技术,众多的小公司得以生存,Microsoft自己不开发"VBX"组件,同样"VBX"进化为"OCX"时,Microsoft并不十分强大,可是这种试探得到众多小公司的响应。1997年Microsoft Office 97、1998年Microsoft推出Visual Studio 6.0,给众多中、小公司提供了生存、发展的机会,例如Microsoft Office 97中集成了Visual Basic for Application 5.0,这项技术使得几百家软件开发商与Microsoft签署了VBA技术许可协议,即使AutoDesk这样的公司都与Microsoft签署了这个协议,这个协议使得每个集成VBA的产品的给个用户许可为Microsoft付40$的许可费,如果你了解VSIP(Visual Studio Integration Protocol)协议,以及有多少公司签订了VSIP协议,你就真正感觉到Microsoft的可怕;Microsoft Office 97、Visual Studio 6.0的用户界面十分漂亮,为什么Microsoft自己的开发工具不提供类似的软件组件?你看到众多第三方的Microsoft盟友纷纷推出自己的界面库以模仿Microsoft,他们不会反对Microsoft,因为他们已经形成了使得Microsoft以及这些公司得以生存的生态圈。

  Microsoft的技术储备有多少,Microsoft之外的人很难说清楚,Microsoft中国公司也未必了解多少,1999年WTL类库刚刚出现的时候,人们就希望WTL能得到官方的支持,或授权给一个Microsoft之外的一个公司(你能想象出Borland C++ 5.0内置的ActiveX开发机制是基于Microsoft ATL类库吗?),直到今天,WTL依然如故,我们完全相信,如果Microsoft强力推广WTL,WTL完全可以流行,可是Microsoft不缺类似的技术,类似的类库还有BCL(Base Control Library,一个用于开发轻量级ActiveX控件的类库),Microsoft还有一个基于ATL的类库,这个类库用于开发ActiveX Designer,ActiveX Designer是绝大多数程序员不了解的一类对象,如果你熟悉Office开发,你知道Office VBA 中有一类对象,即Form2,此外VB6.0 中的报表设计器(以及著名的Active Reporter),都属于此类对象,用这个类库,你可以为VB6.0以及集成VBA的系统提供定制化的可视化设计机制等等,如今ActiveX Designer已经演化为集成于Visual Studio .NET中的设计器。

三、向Microsoft学习

  无论从什么角度评价Microsoft,我觉得Microsoft是值得我们学习的,如果说生活在这个时代有Microsoft存在是一场灾难,你就应该痛恨这个家伙,但你首先要向这个家伙学习!我无意为Microsoft歌功颂德,我只是想说出十几年我对Microsoft技术的感受。

  Microsoft在研究式的开发中受益极大,如果你有兴趣,你可以访问http://research.microsoft.com/,虽然部分中国公司也有研究院,但与Microsoft相比,真有"米粒之珠,也放光华?"的感觉。2003年,我在北京的一个地方现场体验了Microsoft亚洲研究院的招聘会,我看到中国的精英们进入Microsoft的渴望,事实上,在中国大陆,Microsoft亚洲研究院的人力资源已经延伸到各著名高校的相关专业的核心层,我感到,Microsoft几乎不需要"求贤",因为,只要Microsoft需要,精英们会"蜂拥而至",每个人都有"可以理解"的理由而向往那个地方,如果为搞数学研究蜂拥到加州大学,我觉得可以理解,因为那里有数学土壤,出了成果国人也会感到自豪,因为"科学无国界"。技术是否有国界?不知道是否有定论?!想想DVD等技术专利给国内业界带来的灾难,不知道应不应该痛定思痛,在Microsoft校园招聘现场的气氛中,我似乎明白了为什么国人"原创技术"少得可怜。我读过几本Microsoft亚洲研究院的高手写的书,明显可以看出,Bill gate 是他们的精神领袖以及他们对Microsoft的虔诚,国内的研究机构应当研究一下Microsoft的用人之道,Microsoft好像是三国里的人物,不知是刘备还是曹操,或者二者的混合物。我经常路过西格玛大厦,第一次西格玛大厦进入真有"朝圣"的感觉,也与Microsoft中国的几个层次的人打过交道,各中滋味实在一言难尽。

  在Office大战中,国产软件的确在一些方面与Microsoft进行较量,其实给人的感觉很勉强,界面上的似是而非,或用户习惯方面的接近并不能解决根本的问题,一个好的软件开发人员必须是一个软件使用的高手,很难想象一个软件操作水平很拙劣的开发人员能开发出高水平的软件,我最早使用的软件之一就是Microsoft Word,当时的版本是2.0,大概是1992年的事情,给我留下深刻印象的是集成于Word中的Word Basic,后来,我接触到Excel 3.0,不出所料,Excel中集成的是Excel Basic,后来使用的Access中自然内置Access Basic 1.0,在这些软件集成捆绑成Office之前,我就感觉这些产品的构思十分了不起,很具有Microsoft的风格,因为你知道,即使是一个DOS,Microsoft都要提供一个内置的QBasic或GW Basic。虽然关于Microsoft的产品评论很多,作为一个技术人员,我认为Microsoft的产品构思绝对是第一流的,从1994年早期的Office系列到1997年形成的Office 4.2,我认为,技术构思上均领先于我国2002年以后的Office产品,你听说过如下说法吗?"Dos 作为操作系统的时代,Windows是应用软件;Windows是操作系统时,Office成为Dos时代的Windows;那么如果按此规律,Office会不会替代Windows而成为操作系统?",现在在开发领域Visual Studio( .NET)正在成为另一个Office,你注意到了吗?控制Visual Studio( .NET)集成开发环境的仍然是一个Basic语言引擎(Visual Basic .NET)。

  与许多公司不同的是,在技术体系上,Microsoft几乎所有的产品是息息相关的,Windows、Office、Visual Studio .NET虽然各不相同,但公共的核心即将形成,我们已经看到,核心组件方面,Office与Visual Studio .NET日渐趋于一致,例如Microsoft正在将Office 2003的核心组件VBA 6.X逐步用新的Visual Studio Tools for Office替代,而我们依然在一些似是而非的现象上与Microsoft的产品比较差距,国家采购或政府采购支持的公司,不去钻研核心技术,只是急功近利的采用短期行为急于与Microsoft相争,不知是否有蚍蜉撼树的感觉,个人的体验是,先学习Microsoft,踏踏实实的学,了解Microsoft,深入的了解,然后再喊口号。

四、为什么用MFC?

  经过若干年的竞争,Borland 的OWL几乎消失了,这个OWL是个非常漂亮的C++类库,在Borland C++ 3.1风光无限的年代,OWL真正的做到了独领风骚。然而,Borland C++ 4.0错过了进入32位程序的最佳时机,BC 4.0推出后不久,迎来了Win95,Borland仓促上阵,以一个小的"Pack"使得BC4可以编译基于Win4的程序,当时的Visual C++是2.0版,支持Window16的版本为Visual C++1.51,有意思的是Borland可以用同一个编译器同时支持Win16、Win32,而Microsoft却不得不为Win16、Win32提供不同的编译器。然而,非正式版本的Visual C++ 2.1与Visual C++ 2.2却悄悄地支持了Win95的最新特征,即Win95新提供的一组公共控件,在我的印象中,Borland对Win95新特征的支持不利使得MFC与OWL的距离极大的缩短了。稍后到来的Borland C++ 4.5没有改变这个状况,尽管Borland C++ 5.0同时支持OWL与MFC,可是败象已经显露,Borland C++非常遗憾的只走到了5.5版。C++ Builder虽然形式上引入了Delphi的VCL库,可是许多C++程序员并不买账,因为许多以C++为乐的人更喜欢以编辑的模式进行编码。Visual C++ 4.0的出现,在C++这个战场上,Borland开始落败了。

  MFC发展到今天,已经十多年了,尽管褒贬不一,但可以肯定,十几年的技术积累已经奠定了MFC的生存基础,即使Microsoft的长角发布,MFC也不能推出Windows的舞台,事实上,长角(Longhorn)之后的Visual Studio .NET仍将MFC作为一个重要的组成部分,在今年的Visual Studio .NET 2005中,MFC在C++中的位置依然如故。MFC的未来,应该不必担心,只要你深入考察.NET类库,你会发现,MFC的许多思想机制正悄然进入.NET,与此同时,Microsoft的第三方盟友十多年来已为MFC开发了大量的扩展库,如果Microsoft是船,第三方盟友就是载舟之水。许多人认为MFC不发展了,其实是一种错觉,Visual C++ 6的界面十分经典,特别是其中的Docking控制条机制,其实Visual C++ 6的IDE完全就是MFC写的,可是MFC类库中控制条相关的类功能很弱,为什么?你会看到许多与Microsoft友好的公司,他们很快的在MFC基础上实现了Visual C++ 6 的Docking机制,这就是Microsoft的高明之处,Microsoft很会给盟友提供机会,其一贯的做法就是在自己的商品化产品中预先提供一些有趣的特征,使得其他一些公司进行模仿以带动用户群体。Borland不具备这样的储备。MFC第三方市场的繁荣,得益于Microsoft的策略与明智。MFC可否跨平台?理论上完全可以,Microsoft不做,也是策略,但是有许多重要的产品Microsoft却默许MFC移植到其他平台,事实上,Microsoft的合作伙伴之一Mainsoft公司(Windows源码就是从这家公司流失的),几年来就是负责移植MFC程序移植到UINIX、Linux、AIX等操作系统之上。

  新版的Visual C++中MFC已经支持.NET开发了,MFC与ATL的协作更好了。根据我的经验,MFC、ATL与.NET库三者完全可以融合在一起综合应用到实际的开发工作中去,如果你是MFC行家,我希望ATL与.NET库能成为你的忠实的左右手。那么有没有同时支持MFC、ATL与.NET库的程序?当然有,Visual Studio .NET IDE就是!而且Visual Studio .NET IDE还支持用ATL与.NET库扩展的Addin,如果你希望用MFC管理ATL与.NET库,请继续支持我!

五、认识Application对象

  如果你熟悉Microsoft Office,你应该进一步的剖析这个大型软件,Microsoft Office中几乎每个程序都是可二次开发的,这一点得益于Microsoft Office内置的二次开发机制,一个是基于COM机制的VBA模型,另一个是基于.NET框架的托管模型:Visual Studio Tools for Office。作为一名程序员,你应当在技术角度解析Office的技术结构。Microsoft的大多数软件的对象结构可以通过Visual Studio提供的工具OLE/COM Object Viewer考察其类型库得到,通过引用类型库,你甚至可以得到描述对象信息的C++头文件。这样做真是好处多多。一个典型的Office通常都有一个Application对象(或其他一个与之相当的对象),这个对象相当于软件枢纽,在这里,我们不讨论Office,借此话题说说Application对象。大多数支持扩展(Addin、Plugin)的软件都存在类似的构造。通常,一个系统得Application对象或者是一个COM对象,或者是一个.NET对象,如果你的系统存在这类对象,你的系统就基本具备支持Addin、Plugin的机制了。一个理想的做法就是在一个MFC系统中,内置一个ATL对象或.NET对象,稍后我们给出方案如何做到这一点。设计Application对象的关键是如何规划这个对象的属性、方法、事件。如果你希望系统具备良好的扩展性,Application对象是十分关键的,这也是构架艺术的体现。所谓Addin(Plugin),是系统运行时根据需要加载的对象库,Addin(Plugin)之所以可以扩展系统,关键的因素就是系统加载Addin(Plugin)时,将Application对象传递给Addin(Plugin)库,设想一下,如果Application恰到好处的触发了系统事件,而Addin(Plugin)库如愿的解释了事件,一个Addin(Plugin)库的任务不就OK了吗!因此Application对象是系统设计的关键。

  如果你精通ATL对象,在你的MFC系统中添加一个ATL对象,这个任务可以用VC Wizard完成。你已经接受了一个事实,就是MFC程序中存在一个CXXXApp对象(CWinApp的派生类),现在你要做的是增加一个对应得ATL对象。这个对象可以在CXXXApp::InitInstance()中创建,如果ATL对象的类是CXXXAppObject,建议你在CXXXApp对象对象中增加一个成员变量,例如:CComObject<CXXXAppObject>* m_pAppObj,然后可以入下初始化m_pAppObj:

m_pAppObj = new CComObject<CXXXAppObject>;

  注意程序结束时在CXXXApp::ExitInstance()中释放m_pAppObj,语句如下:

delete m_pAppObj;

  你可以将系统得关键属性设置成CXXXAppObject的属性,例如系统得标题、是否为多文档等等。系统希望外部调用的功能可以实现为CXXXAppObject的方法,这一点取决于你的需要。系统需要外部扩展的功能,表现为CXXXAppObject的事件,关键是在恰当的位置触发事件以及提供的事件参数。例如,你可以在CXXXApp::InitInstance()触发应用程序开始的事件OnStartUp,Plugin捕获事件后,可以进行特定的初始化(身份确认、初始信息查询等等);你可以在CXXXApp::ExitInstance()触发应用程序结束事件,Plugin捕获事件后,处理用户需要的系统退出工作。所有的设计取决于具体设计。

  如何加载Plugin,是一个有趣的问题,如果Plugin实现为一个COM范畴(Category),可以运用COM技术枚举这个Category;可以将Plugin安装到一个特定目录,也可以通过注册表。Plugin的实现可以用COM技术、也可以用.NET框架。适当的机会我会提供例子……

六、后记

  一时心血来潮,就写了这篇文章,很难说是有心,还是无意。几天前我在新浪网上看应氏杯围棋决赛,我觉得该赢了吧,作为一个围棋迷,我们等了十几年,等到了属于国人的应氏杯。记得7、8年前在还在大学工作的时候,有一次,一位同事兴致冲冲的走道我面前对我说:"嗨,昨天马XX赢了李昌镐!",当时我在系办公室正在看报纸,那位仁兄见我头都没抬,非常不满的抢下报纸,对我吼道:"喂!马XX赢了李昌镐!!你听到没有!!!",我对他说:"你大惊小怪个啥?!马XX输了李昌镐多少盘,你知道吗?",马XX几乎一直在输给李昌镐,人们已经不奇怪了,偶尔赢一次,国人就把他捧得北都找不到了,李昌镐弱冠17的时候就傲视这个世界了,可至今面孔不变,几天前的农心杯,中日联军5个人,被他打个落花流水,李昌镐是公认的世界第一,以至于有的高手知道下一个对手如果是他,就会去订回程机票。这次应氏杯,国人竟然感谢崔哲瀚,何也?因为这个弱冠19的小子,挡住了他的大哥李昌镐才使得应氏杯有了悬念。当国人媒体在说韩国仅李昌镐一人厉害的时候,不知道是出何居心还是自欺欺人,李昌镐年方30,不知道要力压中、日多少年!面对这个名字,真有点麻木了,这个太极虎!

  软件界又来了我们一向不齿的印度虎,2001年我们的软件出口额仅是印度的四十分之一,我们震惊了,怎么可能呢?这个四十分之一水分很大,很可能更可怜!当时我在大连参加一个关于"大连软件出口国内第一"的官方会议,那位大人在会上说:"据说,我们大连软件出口国内排名第一,市有关领导希望今天的会议给出这个第一的数字依据,希望你们把数据报上来,去年的数据也可申报,注意,我们要的只是数据,你们仔细体会,我们根据数据,有奖励,机会难得呀!"……。某一天,几个朋友在我家看央视的对话节目,对话一方为国内的软件大鳄们(用友、阿尔派等公司的老总们),另一方为印度软件的一个代表团。当问及中、印软件差距的时候,我们的刘老总(代表阿尔派)不以为然的说,据他的看法,我们已经快赶上(印度)了,……,言下之意颇有印度的水平不过如此的感觉,印度方的话我至今记忆犹新:"是否赶上,国际市场说的算!在中国看来,印度程序员的个性不足,技术也不怎么样,其实是个错觉,印度软件首先注重个性,许多重要的美国商品化软件都是在印度本土开发的……",我们的舆论总是将印度程序员的水平描述的平庸至极,可是差距日渐拉开,……,围棋、足球(不好意思谈,谈不出口!)、软件,我们被近邻严酷的封锁了,乐坏了记者们、给媒体带来了生机……

  日本江户时代的围棋,如果一个人要想世袭一个称号(例如:本因坊),他必须战胜所有的师兄弟,然后,住进师父家的内室,你知道以后的事情吗?以后,这个棋手,就得为师父一家做饭、带孩子、搞卫生……,其余的门人则一心一意的下棋,这样的人、方式,造就了一代一代的本因坊,他们的棋谱大多数都流芳至今,这就是早期日本围棋的悟道模式。软件总共有多少语句?我最早接触的计算机软件教材是一本英文版的(影印的D版),不同于我们,那本书的作者构造了"X-语言",他们不讲什么C、Pascal、Basic,一旦缺了什么机制,就给"X-语言"添加些成分。什么C、Pascal、Basic,你感觉差不多,但现在却分出了等级!我们驾驭语言的能力弱得很,可是我们在语言的细微之处却很讲究,不知道对不对,许多程序员也许是出于虚荣而用C++,事实上,地球人到知道,做数据库,Delphi、VB远比C++胜任,铺天盖地的C++的书,写的东西几乎雷同,因为,有用的或者作者不写、或者作者不懂。有时我在想,如果国内没有内需,会怎样?也许软件内需的存在,造就了中国软件的特色,我认为国内业界并没有充分利用中国软件内需的存在,也许中国软件内需的存在是软件落后的硬伤。

  我记得一部电影《神辫》,那个英雄的大辫子被洋人炸掉了,最终他成了神枪手,战胜洋人用大刀、秘籍是不行的,用洋的东西战胜洋的技术才是正道。我觉得,一个好的程序员必须了解软件的历史,学习历史,你知道你为什么弱,别人是如何强大的。我们正在另一个战场上抗美(可笑的是我们却要赶超印度!),无论Microsoft、Borland如何争斗,无论他们谁统治谁,他们不影响美国的强大,朋友们,学习Microsoft,开发出让国人感到牛的软件!

posted @ 2006-12-04 22:05 volnet 阅读(699) | 评论 (0)编辑 收藏

CListCtrl(List Control)绑定ODBC数据库的方法。(附加:CRecordset::Open()与CRecordset::OpenEx()区别之真实体验~)

今天怀着虞城的心来探索打印CListCtrl的方法,可惜忙到现在被老掉牙的数据加载给绊倒。但是从中却学到了不少新东西,以前没有遇到过的。现在就写出来和大家分享。
ODBC数据源与CListCtrl的连接已经算是老生常谈的事情了。
1、先建立数据库(这里以一个PrintTest为数据源名来处理,该数据库包含一张表info,里面有四个字段,ID,NAME,GROUP,AGE,只是测试用因此随便列出几个字段,其中ID为数字类型,其余为文本,采用Access数据库来建立。方法就是添加一张表,然后分别对表中填充一些数据,这里就不再讲述!)
2、ODBC数据源与程序的连接
   a.在stdafx.h文件的尾部添加#include "afxdb.h"
   b.针对于整个工程的全局函数CDatabase db;
   c.在APP文件的初始化进程中添加打开数据库的语句
         

    CWinApp::InitInstance();     // 此句为系统自动生成的;

    
if  ( ! db.IsOpen())
        db.Open(
" PrintTest; " );
    
else
        AfxMessageBox(
" 数据库连接失败! " );

    AfxEnableControlContainer();    
// 此句为系统自动生成的;

至此,与数据库的连接基本上完成了,也正是因为这个db.Open("PrintTest;");才有了这篇文章。
3、向记录集(CRecordset)填充数据,在这里我们必须要谈到(数据库和记录集对象之间的)记录字段交换 (RFX)。(大家可以在MSDN中查阅相关信息。)现在只将步骤做一个简述:
   a.在“类视图”中添加类,然后选择“MFC ODBC 使用者”;
   b.在向导中,数据源按钮后选择“机器数据源”选择我们设置的ODBC数据源,这里为PrintTest;确定;
   c.在弹出的对话框中选择info表,确定;
   d.修改类名,文件名(如果有必要的话),这里改为CInfoRS,InfoRS.h,InfoRS.cpp
   e.注意下面的选择是“动态集”,确定。(警告关闭)
这时候你可以在类向导中看到添加的新类,CInfoRS
4、在初始化对话框的时候进行数据的读入。
值得注意的是:我们刚才定义的是全局的变量,但是定义的语句是在APP文件中写入的,因此在Dlg文件中调用的时候我们仍然需要去声明一下它是全局变量,也就是对Dlg来说,它是在外部已经定义过的变量。因此在Dlg.cpp的开头我们补充extern CDatabase db;
在BOOL CPrintListCtrlDlg::OnInitDialog()中添加

     //  TODO: 在此添加额外的初始化代码 // 注意找到该函数中的这句话,在其后添加以下代码
    m_cList.SetExtendedStyle(LVS_EX_GRIDLINES);       // 设置ListCtrl的风格
     int  nWidth = 110 ;
    m_cList.InsertColumn(
0 , " 会员编号 " ,LVCFMT_LEFT,nWidth * 2 / 3 );
    m_cList.InsertColumn(
1 , " 会员姓名 " ,LVCFMT_LEFT,nWidth);
    m_cList.InsertColumn(
2 , " 会员组织 " ,LVCFMT_LEFT,nWidth * 3 / 2 );
    m_cList.InsertColumn(
3 , " 年龄 " ,LVCFMT_LEFT,nWidth / 2 );
    CInfoRS rs(
& db);

    UpdateList(rs);


在这个应用程序中同样要注意到,因为我们需要的是一张类似Access表的表格,而不是类似我的电脑的图标形式的风格,因此我们需要在添加的ListControl的时候,将其属性中的View设置为Report。

 UpdateList(rs);是我们自己添加的一个函数,再此我再介绍一下使用类向导添加函数的方法。
在类视图中,右键,添加->添加函数,然后添加相关参数,比如返回值类型,参数类型等,记得添加参数的时候按“添加”将其添加到参数列表中。
下面列出UpdateList的代码:

void  CPrintListCtrlDlg::UpdateList(CInfoRS &  rs)
{
    
int  i = 0 ;
    CString strID;
    rs.Open();
    m_cList.DeleteAllItems();
    
while ( ! rs.IsEOF())
    
{
        m_cList.InsertItem(i,
"" );
        strID.Format(
" %d " ,rs.m_ID);
        m_cList.SetItemText(i,
0 ,strID);
        m_cList.SetItemText(i,
1 ,rs.m_NAME );
        m_cList.SetItemText(i,
2 ,rs.m_GROUP);
        m_cList.SetItemText(i,
3 ,rs.m_AGE);
        rs.MoveNext();
        i
++ ;
    }

    rs.Close();
}
至此这个程序基本上就编写完成了,但是使用Ctrl+F5调试的时候出现了错误。错误具体就不再描述,只告诉解决的方法。
1、一个是CInfoRS类中一句#error Security Issue: The connection string may contain a password
解决方法:注释掉
2、类型不匹配:
  m_cList.SetItemText(i,1,rs.m_NAME );
  m_cList.SetItemText(i,2,rs.m_GROUP);
  m_cList.SetItemText(i,3,rs.m_AGE);
将提示rs.m_NAME,rs.m_GROUP,rs.m_AGE不能从“CStringW”转换为“LPCTSTR”
解决方法:在类视图中定位到CInfoRS,在其变量(蓝色方块后),随便点一个进入。按以下方法修改:
//将以下代码:
    long    m_ID;
    CStringW    m_NAME;
    CStringW    m_GROUP;
    CStringW    m_AGE;
//修改为:
    long    m_ID;
    CString    m_NAME;
    CString    m_GROUP;
    CString    m_AGE;
//即将这里的CStringW替换为CString


//其实可以注意到之前的一大段话:以下字符串类型(如果存在)反映数据库字段(ANSI 数据类型的 CStringA 和 Unicode数据类型的 CStringW)的实际数据类型。这是为防止 ODBC 驱动程序执行可能不必要的转换。如果希望,可以将这些成员更改为CString 类型,ODBC 驱动程序将执行所有必要的转换。(注意: 必须使用 3.5 版或更高版本的 ODBC 驱动程序以同时支持 Unicode 和这些转换)。
至此,编译通过。
但是,随后弹出错误:ODBC数据源不支持动态集
修正这个问题的方法有二:
一、在刚才添加的时候,将动态集(默认)改为快照,在这里,将不会出现错误。
二、令人庆幸的是我曾经做过一个例子,里面确实是使用动态集,但并没有出现这个错误,于是我找到了另一个程序,再次调试通过。于是就很是郁闷。于是用断点调试,最终确定问题是发生在rs.Open();的位置。
于是查找MSDN发现(For CRecordset, the default value is CRecordset::snapshot.翻译:对于CRecordset默认值类对象,默认值是 CRecordset::snapshot,也就是快照模式),而我们所用的是动态集的模式。这里可以将rs.Open();改为rs.Open(CRecordset::forwardOnly);再次编译就可以通过了。
另外可以将最初的db.Open("PrintTest;");改为db.OpenEx("DSN=PrintTest;");就可以解决问题了。这其中的奥妙就不是很清楚,只能当作经验来和大家分享一下。也希望有知道的人能够留言告诉我。谢谢先~!


以下将本示例的代码以及数据库打包供大家学习下载!
http://www.cppblog.com/Files/mymsdn/PrintListCtrl.rar

附录:
1、编译调试:Visual Studio.NET 2003中文版
2、在主对话框需要添加一个ListControl的控件。(下载的代码可能还多包括一个打印控件,但该控件的功能并未实现,只是一个预留的测试功能。大家自行练习的时候可以不添加该按钮。)

posted @ 2006-09-18 02:07 volnet 阅读(3738) | 评论 (0)编辑 收藏

如何利用MFC建立的对话框应用程序中一键实现对CListCtrl(List Control控件)列表的表格打印?

如何利用MFC建立的对话框应用程序中一键实现对CListCtrl(List Control控件)列表的表格打印?
这是一个让我觉得郁闷的问题:
问题描述:
1、常规利用一个MFC对话框应用程序实现一个数据库管理系统
2、在完成查询后,希望能够打印出结果。
3、为了简化功能,实现打印功能,将仅实现基本打印功能。
思路分析:
1、CListCtrl类是派生于CListView类的类,而CListView类又是从CView类派生的。因此可以利用CView类的打印功能来输出相关数据。(找到了成功的打印模型)
2、……
参看参考文章:打印CView类文章.rar(http://www.cppblog.com/Files/mymsdn/打印CView类文章.rar)

本文章并未实践过,请高手分析一下思路是否可行,该套用是否可行以及潜在的难点。

posted @ 2006-09-17 14:13 volnet 阅读(3269) | 评论 (2)编辑 收藏

用文档序列化来保存打开文件[理论联系实际]

     摘要: 文档与序列化 一、文档的基本特征 文档类文件是从CDocument继承而来的。 ...  阅读全文

posted @ 2006-08-16 23:19 volnet 阅读(2417) | 评论 (0)编辑 收藏

仅列出标题
共9页: 1 2 3 4 5 6 7 8 9 
特殊功能