C和CPlusPlus

C和Delphi枚举类型定义的转换

这两天转换C语言的头文件时发现一个问题。Delphi的枚举类型和C是不完全等价的。C的枚举类型的size总是4个字节,而Delphi的枚举类型的size跟最大枚举值有关,如果最大枚举值小于255,枚举的size只有1。所以移植C程序的时候,要在Delphi的枚举定义后加上一个值为$FFFFF的枚举项目,这样才能保证Delphi枚举定义的Size是4。

VC2005 程序的部署问题

上周发布的SQLite Developer2.90,2.91有用户报告无法加载sqlite3.dll。2.90版的sqlite3.dll为了追加ICU的支持,是用VC2005重新编译的,我一开始估计是依赖的DLL不存在,用Dependency walker看了一下,发现VC2005编译后的DLL引入了对MSVCR80.dll的依赖,于是将这个DLL发给了用户,结果还是报告同样的错误。很是困惑不解,于是上google上搜索了一下,才知道从VC2003开始微软为了解决DLL 版本不一致的问题,引入了基于manifest的版本管理,也就是所谓的side by side assembly的依赖管理方式。这就使得DLL和程序的分发部署变得非常复杂,简单的在程序所在目录放置相关的DLL已经不行了。安装程序必须导入一个MSI的安装包。可是我只用了一个DLL,就需要分发额外的MSI安装程序,特别是我的安装程序是用Innosetup写的,导入MSI很麻烦。搜索了半天google,终于发现只要暴力编辑一下编译后的DLL的Manifest资源信息,去掉对于版本的指定就可以了。微软为了解决一个麻烦的问题,导入了一个更加麻烦的问题,真是shit。

 

参考了下面这篇文章

为Source Insight添加SourceSafe的控制命令

  1. 首先确保你的Source Insight的ProjectSettings中的Project Source Folder和你的代码所在的根目录一致。
  2. 然后,点击Options / Custom Commands来添加自定义的版本管理命令添加Check In 命令
    • Run中输入命令行SET SSDIR=\\XXXX\VSS; SET SSUSER=chen; ss cp \;ss cp ProjectFolderName;ss Checkin $%r,替换ProjectFolderName为你的项目所处的VSS的目录名,设定SSDIR为SourceSafe的配置文件所处的共享目录名。
    • Dir输入框中输入%d
    • 去掉Pause When Done选项
  3. 依次添加Check out,Get Last Version等命令即可

系统移植的一个常见问题

最近要把一个其他系统上的程序移植到Windows,其中用到一个数据文件,用原来的程序在Windows上编译后,一运行就访问越界,跟踪后发现,解析文件数据时,凡是读取ULong的地方,数据都取反了,问了一下,原来系统是基于Motorola的CPU的,而motorola CPU同Intel CPU的Word中高低位字节存放顺序正好是反的,因此ULong转换失败,写了一个高低字节转换程序就OK了。这应该是异构系统移植一个常见问题

在VC多线程中操作MFC界面

在VC中,MFC的界面不是线程安全的,我们不能在工作线程中直接操作界面,同时MFC中也没有提供类似于Delphi的VCL的Lock方法,要想在线程中修改界面状态,通常来说是通过发消息来实现的.

有些时候,我们可以用WM_Timer消息处理来模拟多线程的运行效果,因为WM_Timer的消息处理是一个伪多线程,其实是在主线程中运行的,所以可以直接操作界面,但是同多线程的最大区别就是当界面执行一个长周期的堵塞操作时,WM_Timer消息处理函数根本不会被执行,而线程则不会有这样的问题。

XWindows的API有点恶心

最近在把一个原来在Unix上的XWindows的程序移植到Windows,看了一下XWindows的API,感觉好恶心,传参数使用了大量的数组,感觉比Windows的API还要恶心。比较郁闷 :sick

将一个消息处理过程绑定到多个控件

在VC中,我们使用ClassWizard可以创建指定控件的消息处理函数,但是如果界面上有多个控件要处理时,需要绑定多个消息处理过程,如果消息处理过程完全一下的情况下,会造成大量的代码冗余,幸好VC中提供了基于控件ID范围设定的消息宏,可以将一个消息处理过程绑定到多个控件上,比如ON_CONTROL_RANGE。vc中只定义了一些常用的基于范围的消息绑定宏,特殊的消息范围宏,我们可以自定义来实现,下例就是一个将EN_SETFOCUS消息处理函数绑定到多个控件的宏。

用于调试的两个宏

VC里面提供了两个可以在调试期间获得当前行号,当前单元名称的宏, __FILE__, __LINE__,可以自定义一个异常,将行号,单元名传给异常,俘获异常后,将信息输出到日志中,可以很方便的用于调试.

不要在构造函数和析构函数中抛出异常

原因好像挺简单的,C++中没有对构造和析构函数如何处理异常作出定义,每种编译器的实现都可能不同,在构造和析构函数中产生的异常很可能导致程序崩溃.

Boost字符串处理库

lexical_cast实现字符串和基础数据类型之间的转换。

format用于字符串格式化。

同步内容