随笔-7  评论-18  文章-1  trackbacks-2
  2005年7月25日
问题起因:
  
    在写WritePrivateProfileString写.ini配置文件时在msdn中看到,如果想要写得配置信息即时生效必须在之前使用WritePrivateProfileStringW来re-read一下目标.ini文件,其原文如下:
   
    // force the system to re-read the mapping into shared memory 
    
// so that future invocations of the application will see it 
   
//  without the user having to reboot the system 
  WritePrivateProfileStringW( NULL, NULL, NULL, L"appname.ini" ); 

    查了一下msdn中WritePrivateProfileStringW的原型如下:
   
WINBASEAPI BOOL WINAPI WritePrivateProfileStringW (
 LPCWSTR lpAppName,
 LPCWSTR lpKeyName,
 LPCWSTR lpString,
 LPCWSTR lpFileName )

    其中的每个参数的类型都为LPCWSTR,实际中获得的文件名都为CString,问题产生。

问题分析:

    LPCWSTR 是Unicode字符串指针,初始化时串有多大,申请空间就有多大,以后存贮若超过则出现无法预料的结果,这是它与CString的不同之处。而CString是一个串类,内存空间类会自动管理。LPCWSTR 初始化如下:
    
LPCWSTR Name=L"TestlpCwstr"
    
    由于LPCWSTR必须指向Unicode的字符串,问题的关键变成了Anis字符与Unicode字符之间的转换,不同编码间的转换,通过查找资料可知,可以ATL中转换宏可以用如下方法实现:
//方法一
CString str=_T("TestStr");
USES_CONVERSION;
LPWSTR pwStr
=new wchar_t[str.GetLength()+1];
wcscpy(pwStr,T2W((LPCTSTR)str));

// 方法二

CString str
=_T("TestStr");
USES_CONVERSION;
LPWCSTR pwcStr 
= A2CW((LPCSTR)str);

  MFC中CString和LPSTR是可以通用,其中A2CW表示(LPCSTR)  -> (LPCWSTR),USER_CONVERSION表示用来定义一些中间变量,在使用ATL的转换宏之前必须定义该语句。

    顺便也提一下,如果将LPCWSTR转换成CString,那就更加容易,在msdn中的CString类说明中提到了可以直接用LPCWSTR来构造CString,所以可以进行如下的转换代码:   

LPCWSTR pcwStr = L"TestpwcStr";
CString str(pcwStr);

问题总结:    
    在头文件<atlconv.h>中定义了ATL提供的所有转换宏,如:    

  A2CW       (LPCSTR)  -> (LPCWSTR)
  A2W        (LPCSTR)  
-> (LPWSTR)
  W2CA       (LPCWSTR) 
-> (LPCSTR)
  W2A        (LPCWSTR) 
-> (LPSTR)

     所有的宏如下表所示: 

A2BSTR OLE2A T2A W2A
A2COLE OLE2BSTR T2BSTR W2BSTR
A2CT OLE2CA T2CA W2CA
A2CW OLE2CT T2COLE W2COLE
A2OLE OLE2CW T2CW W2CT
A2T OLE2T T2OLE W2OLE
A2W OLE2W T2W W2T

上表中的宏函数,非常的有规律,每个字母都有确切的含义如下:
2 to 的发音和 2 一样,所以借用来表示“转换为、转换到”的含义。
A ANSI 字符串,也就是 MBCS。
W、OLE 宽字符串,也就是 UNICODE。
T 中间类型T。如果定义了 _UNICODE,则T表示W;如果定义了 _MBCS,则T表示A
C const 的缩写

    利用这些宏,可以快速的进行各种字符间的转换。使用前必须包含头文件,并且申明USER_CONVERSION;使用 ATL 转换宏,由于不用释放临时空间,所以使用起来非常方便。但是考虑到栈空间的尺寸(VC 默认2M),使用时要注意几点:

    1、只适合于进行短字符串的转换;
    2、不要试图在一个次数比较多的循环体内进行转换;
    3、不要试图对字符型文件内容进行转换,因为文件尺寸一般情况下是比较大的;
    4、对情况 2 和 3,要使用 MultiByteToWideChar() 和 WideCharToMultiByte();

    对于这些方面更多的知识可以参见MSDN相关文档(如:Article 3. Strings the OLE Way),问题总结中的一些资料来源于杨老师的Com编程文章http://www.vckbase.com/document/viewdoc/?id=1488,在此表示感谢。

   




   

posted @ 2005-07-25 20:40 九斤老太 阅读(11704) 评论(2) 编辑
  2005年7月14日
    很多东西其实可以慢慢积累,Blog又好久没纪录什么东西了
看样子我是个不能坚持的人。对于技术我也一样,面多人泛泛。
年龄大了,对技术没有了以前的狂热,那激情应该转向何方呢?
总不能没有激情吧,那跟行尸走肉没什么两样。。
posted @ 2005-07-14 14:53 九斤老太 阅读(244) 评论(0) 编辑
    vc没用多久,出了不少问题,程序两次Crash,原因非常简单
    
    一次是指针的多次释放,导致程序crash,以前没有认识到厉害,现在总算见识过了。一个那么大的程序就是因为某个指针的多次释放而瘫痪。
    一次是消息的处理函数有问题,MSDN规范了所有系统消息处理函数的原型,一不小心对消息的处理函数添加了两个无用的参数,Debug时没有任何问题。Release时程序却Crash了,并且对于没有经验的我来说还不容易找到问题所在。

    这些对刚刚使用vc/mfc编程的人来说,使很容易犯的错误,希望自己能吸取教训。

                                                                                                                   
                                                                                                                                卑鄙
posted @ 2005-07-14 14:45 九斤老太 阅读(436) 评论(0) 编辑
  2004年5月11日

今天碰到一个问题在存储过程里添加一条记录
Insert TableName(Field1,Field2,Field3) value (Value1,Value2,Value3);

由于TableName中有一个标识字段Field_ID,于是给我返回错误信息
无法将NULL值插入Field_ID。
非常郁闷,Field_ID是自增长的为什么还要我手动插入呢?
缺省情况下 IDENTITY_INSERT为OFF,不可显示插入Field_ID的值。
最后的勉强的解决办法是:
一,
Set IDENTITY_INSERT TableName OFF (可不写 缺省)
Insert TableName Value(Value1,Value2,Value3);
这种情况下是可以的,就是说缺省情况应该将除标识以外所有的字段都对应赋值插入
不能只对几个字段赋值插入。

Set IDENTITY_INSERT TableName ON
Insert TableName (Field_ID,Field1,Field2,Field3) Value (Value_ID,Value1,Value2,Value3);
Set IDENTITY_INSERT TableName OFF
这样也是可以的 实现标识字段的显式插入 但标识的自增长就无效了。

目的是达到了,但是上面一些疑问还没有完全解决,谁理论上解释一下?

posted @ 2004-05-11 17:01 九斤老太 阅读(2122) 评论(7) 编辑
  2004年4月29日

Java中的这个类很好用,但在.net却没有提供,只好手动写一个了 
 
/// <summary>
 ///  StringTokenizer 单词分析类
 /// </summary>
 public class StringTokenizer
 {
  // data语句,delimiter是单词之间的分隔符
  private string data,delimiter;
  // 存放单词的字符串组
  private string[] tokens;
  // 索引号
  private int index;
  
  /// <summary>
  ///  StringTokenizer:构造函数
  /// </summary>
  /// <param name="dataLine"></param>
  public StringTokenizer(string dataLine)
  {
   init(dataLine," ");
  }

  /// <summary>
  ///  StringTokenizer:重载构造函数
  /// </summary>
  /// <param name="dataLine"></param>
  /// <param name="delim"></param>
  public StringTokenizer(string dataLine,string delim)
  {
   init(dataLine,delim);
  }

  private void init(string dataLine,String delim)
  {
   data = dataLine;
   delimiter = delim;
   //
   // 将字符串转化为数组

   tokens = data.Split(delimiter.ToCharArray());
   index = 0;
  }
  
  // 判断是否还有单词
  public bool hasMoreElements()
  {
   return (index < (tokens.Length));
  }

  public string nextElement()
  {
   //获得下一个单词
   if(index < tokens.Length)
    return tokens[index++];
   else
    return "";
  }
 };

posted @ 2004-04-29 09:40 九斤老太 阅读(2271) 评论(4) 编辑

这个世界上还有一个故事,叫做《大话西游》。

世界是巨大的枷锁,你不得不重复自己或是别人的生活。
记得长辈说过:年轻是一种罪过。他们说我们不成熟。

真切地为自己的不俗喝彩,在深切的郁闷中,突然就看懂了《大话西游》的开头: 一位才华横溢又无法无天的青年(孙悟空),根本不喜欢世人摊派给他的大事业(西天取经)。他尤其受不了师父(唐僧)的唠唠叨叨,可世俗条规(观音)又不放过他。为让他悔悟,心甘情愿地去取经,唐僧和观音达成妥协:让他五百年后重新做人。 这真是一个宿命的开始。

九七一师兄曰:“大学的孩子都是玻璃罐里养蛤蟆,前途光明出路不大。”再贴切不过。大闹天宫无非是大学四年的黄金时光罢了,找到工作走上社会任你盖世的才华浑身的个性也自有翻不出的五指山来压。只有戴上紧箍咒取经去,九九八十一难,做一个奇奇怪怪的佛。你别无选择。

五百年后的悟空叫至尊宝,在五岳山从事一份很有前途的职业-- 山贼。命运却要他扮演孙悟空,至尊宝只是个过渡罢了。蜘蛛精来了,白骨精来了,菩提老祖来了,牛魔王也来了……都是棋子,安静地立在命棋盘的中央。
他的路线是早定好的:(1)一个人给他三颗痣(2)戴上紧箍咒(3)打败牛魔王(4)西天取经。可怜的至尊宝什么都不知道,认认真真做山贼,还爱上了白骨精,想和她结为百年之好。
 
所有的事都瞒着他接二连三地发生。

十年前我绝对不知道今天自己会在杭州的一所大学里学习,如今已隐隐感受到那冥冥之中的牵引。可怕的是这还绝不是终点,不到游戏结束我不会知道答案。真相将揭晓,在我临死的瞬间。

给至尊宝三颗痣的人是紫霞仙子。谁说的:总有一个女孩出现,让男孩最终成为男人。而男人永远都不可能得到她,那简直是一定的。

非常喜欢紫霞的开场白:“现在我郑重宣布,这座山上所有的东西都是我的,包括你。”那样的气贯云霄,像一个童话故事。
而现实是:这个世界没有什么属于你,包括你自己。也许我们就是为了创造属于自己的东西才来到这个世上,因为年轻,所以押注于爱情。
 
至尊宝拒绝了紫霞,他以为自己还爱晶晶。见到晶晶,他又发现紫霞才是真爱。命运一直在同他开玩笑:至尊宝忽然成了孙悟空,千辛万苦找晶晶又爱上了紫霞。而抉择是那样残酷:要打败牛魔王救紫霞,就必须戴上紧箍咒做回神通广大的孙悟空;而戴上紧箍咒就不能有半点情欲,只有取经去。
 
为至尊宝不平:不明白在这样的故事里为何爱情总要成为牺牲品,干嘛不让周星弛携紫霞纤纤小手--走先!我曾无数次在网上反映过类似意见,搞得很累。爱情是那样美丽而脆弱,无法直面生活的琐碎和坚韧。哪段感情又没有绚烂的瞬间和艰难的长久,在一起就会幸福吗,未必。
 
至尊宝挖开自己的心,看到了紫霞留在那里的一滴眼泪,毕竟曾经沧海过。 五百年又五百年,兜了一个大圈子又回到了原地。人没能战胜命运,而人的尊严却在抗争中得到了肯定,人的情感也必将不朽。 “生亦何欢,死亦何苦。”大彻大悟。

紧箍咒,圈住昔日的梦想,圈住棱角分明的个性。
 
成熟是一个很痛的词,它不一定会得到,却一定会失去。
 
永别了,激情四溢的花样年华!永别了,神采飞扬的青春岁月!永别了,同学!永别了,爱人同志!至此后漫漫长路我独行。

望着荧幕上扛着金箍棒的悟空,忽地明白了本班男生什么自称光棍。向光棍行者们敬礼!
 
全片最后一句台词是:“你看那个人,好奇怪哟,象一条狗。”
罗曼蒂克、海誓山盟、生死相许……面对爱情这些都是琐碎,不值一提。
爱情就是爱情,不是别的什么东西。
能与爱情同在的只有生命,其他都滚一边儿去。
你爱了,难道还不够吗?
悟空爱了,不论晶晶还是紫霞,他都要将爱情进行到底。
晶晶爱了,那个弃她而去的悟空,“不能和喜欢的人在一起,做人又怎会开心。”
紫霞爱了,“谁拔出我的紫青宝剑,谁就是我的如意郎君。”
爱一个人需要理由吗?
孙悟空会爱白骨精,*八戒爱上了蜘蛛精。紫霞爱他至深,因为他拔出了一把剑。

故事里的人找爱人的理由永远千奇百怪:王子要用水晶鞋才能找到灰姑娘,薛宝钗要那有玉的人来配……可生活永远现实得多,芸芸众生,谁又能许谁一个未来,自欺欺人罢了。
 
有理由也好,没理由也罢,可还是要爱。让我去,过程就是结果,无悔。

爱无须掩饰无须矫做无须患得患失,只要像紫霞一样说:“让我们立刻开始这段感情吧!先亲我一下。”
爱是身不由己。
晶晶口中道:“我再也不会为这个男人心痛了。”可还是要为他拔剑与人拼命。
至尊宝梦中也要叫紫霞的名字七百四十一次,不知道的人觉得紫霞一定欠了他很多钱。

紫霞说:“就象飞蛾,明知会受伤也要扑到火上。” “我无力抗拒,向你狂奔去。”无可救药的痴迷。
爱是奋不顾身。

至尊宝对晶晶说:“你杀了我吧,我不希望你看我的时候心里却想着别的人。”
晶晶以为:“都是骗我的。”跳下崖去。
紫霞把身体挡在至尊宝面前,刺进牛魔王的铁叉里。
一时间,以后的人生如何,大家都无所谓了。连那样宝贵的性命,也打算随时给爱情作了祭品。一个个一头扎进这情爱苦海,宁愿永生永世不得超生。
爱深刻莫测。

三十娘流着泪说:“想我春三十娘貌美如花,却跟这么丑的人有了。” 这是多少美丽自负的女子的宿命:心中的他是能文能武翩翩少年,枕边人却鼾声如雷大腹便便。谁敢说多年后眼望自己的丈夫不会有如此感觉,真不知幸福还是心酸。不过还是要为他挺
身而去无限牺牲,像春三十娘为*八戒放下断龙石与牛魔王同归于尽。

晶晶爱悟空,至尊宝爱晶晶,紫霞爱至尊宝,“他爱你你爱我我爱他”,千古无解的方程。《白马啸西风》里说:“如果你深深爱着的人,却又深深爱上了别人,能有什么法子?”
 
所以紫霞说:“爱一个人原来是那么痛苦。” 晶晶找不到那个抛弃她的悟空(象不象殷离),告诉至尊宝:“你经过五百年回来要找的不是我。”至尊宝原以为可以与初恋共度今生,谁知初恋的时候并不懂情爱人生。当年被他推开的紫霞已经悄无声息地抵达他灵魂的最深处,而他却不自知。可紫霞死了:“我的意中人是个盖世英雄,有一天他会踩着七色的云彩来娶我,我猜中了前头,可是我猜不着这结局……”
没有人猜得中结局,一切随风而去。

恋爱的时候我们都不懂爱情,懂得爱情后却失去了可以相爱的时光。

最绝望不是他不爱你或他离你而去,最绝望是你忘记了怎么去爱一个人,你已丧失了爱的能力。

请记住下面的台词:“曾经有一份真诚的爱情摆在我的面前,但是我没有珍惜。等到了失去的时候才后悔莫及,尘世间最痛苦的事莫过于此。如果上天可以给我一个机会再来一次的话,我会对你说三个字“我爱你”。如果非要把这份爱加上一个期限,我希望是一万年!” 也顺便记住这段话的原版,在王家卫的《重庆森林》里:“如果记忆是一个罐头,我希望它永远都不会过期,如果一定要加上一个期限的话,我希望是一万年。”

至尊宝第一次说这番话是骗紫霞,第二次说已痛不欲生。 总有一天,你会在灵魂最温柔的一隅为她重复这段话,为了你们即将封存的一万年。 “如果有一天我忍不住问你,你一定要骗我。不管你心里有多么不愿意,你都不要告诉我你从来没有喜欢过我。”

此情可待成追忆
只是当时已惘然!

上大学之前是不喜欢周星弛的,那时心中只有英雄。
经历过和正在经历着悟空式的命运和紫霞式的爱情,才发现生命的本质是以最低的姿态出现的。
英雄?你为什么不问问做英雄的代价?

 

posted @ 2004-04-29 09:31 九斤老太 阅读(823) 评论(0) 编辑
  2004年4月28日
最近在.NET中使用iOffice OWC组件时,不小心碰到了Com组件兼容性的问题,以前没有注意到相关问题,昨天查了些资料暂时将这个问题解决了。

方法一:在使用组建的页面添加<%@ Page aspcompat=true %>

        由 Visual Basic 6.0 等早期生成的 COM 组件调用了单线程运行单元(STA)。为了避免 ASP.NET 产生兼容性错误,我们可以在 <%@ page > 标记里设置 aspcompat 属性,以指示 ASP.NET 在 ASP 兼容模式下执行它。如果不以这种方式执行会出现安全错误。

        如果将此标记的值设为 true,还可以调用COM+1.0组建,但是这种方式性能会稍微有些下降。

方法二:NET 框架 SDK 在文件 Tlbimp.exe 中附带了一个名为类型库导入程序 (TlbImp) 的实用工具,该工具通过围绕组件生成托管包装将 DLL 文件中的标准 COM 组件转换为等效的 .NET 框架程序集。转换后的组件可以早期绑定到托管代码以获得显著提高的性能。

          这个方法应该是可以的,但是还没有去实验。

需要注意的是使用 Interop Assembly 时,虽然 ASP.NET 本身无法判断 COM 组件是否调用 STA,但是通过 aspcompat 属性可以避免由于 STA 引起的效率过低或者死锁。

         
posted @ 2004-04-28 09:51 九斤老太 阅读(1448) 评论(5) 编辑
昵称:九斤老太
园龄:7年9个月
粉丝:0
关注:0
<2012年2月>
2930311234
567891011
12131415161718
19202122232425
26272829123
45678910

搜索

 
 

常用链接

随笔分类

随笔档案

文章分类

最新评论

阅读排行榜

评论排行榜

推荐排行榜