受伤了
Submitted by hubdog on Tue, 2010-03-09 00:01前两天坐自动扶梯的时候,脚下拌蒜,结果来个后空翻,右边肋骨被磕了一下,这两天好痛,起床都要运半天气。幸好还没有骨折,算是不幸中的万幸。好痛苦呀
如何测试C++类的Private成员和Static函数
Submitted by hubdog on Tue, 2010-01-26 22:40这两天在写一个C++类的单元测试,为了确认运行结果,需要访问C++类的Private成员,
为了不修改被测试的C++类的源代码,比较猥琐地使用宏定义将private改成public,
#define private public
#include <xxx.hpp>
...
#undef private
测试static函数,就比较麻烦了
首先要Include相应的c文件,有时交叉引用会导致无法编译通过,相当麻烦。
用C++编译器编译C文件
Submitted by hubdog on Wed, 2010-01-13 17:50注意在C的头文件中要加上下面的宏定义
#ifdef __cplusplus
extern "C" {
#endif
C函数定义
#ifdef __cplusplus
}
#endif
或者
extern "C" {
#include "aaa.h"
...
}
libcmt.lib和msvcrtd.lib的冲突问题
Submitted by hubdog on Wed, 2010-01-13 17:41今天在编译一个程序时,发生了下面的错误。
libcmt.lib(sprintf.obj) : error LNK2005: _sprintf already defined in msvcrtd.lib(MSVCR80D.dll)
调查发现,编译程序中调用的DLL是使用动态链接进行编译的,但是这个程序又链接了一个使用静态链接的库,这两个库恰好又同时用到了sprintf这个函数,这就导致了命名冲突的问题,将两个库都使用动态链接后就改好了这个问题。
MSDN上有一篇文章讲了静态和动态链接的区别。
http://msdn.microsoft.com/en-us/library/abx4dbyh%28VS.80%29.aspx
在Delphi中创建类似于Printf这样可变参数的函数
Submitted by hubdog on Sat, 2009-12-26 22:49Delphi本身是不直接支持写Printf这样的变参函数,Format这样的函数类似于Printf,但是还是要多写两个括号,
我觉得太麻烦,其实我们可以间接的实现这样的函数,懒得解释,贴了段程序
program TestVar;
{$APPTYPE CONSOLE}
uses
SysUtils, Windows;
type
VA_FN = function(const par1{, ...}: PAnsiChar): Boolean; cdecl varargs;
vsnprintf和wvsprintf的区别
Submitted by hubdog on Sat, 2009-12-26 22:43vsnprintf和wvsprintf的唯一区别就是wvsprintf函数不能处理浮点格式化字符串。
倒霉的是Delphi自带的Windows.pas里面只提供了wvsprintf的定义。要想使用vsnprintf,我们需要引用MSVCRT.dll中的
vsnprintf函数
function _vsnprintf(buffer: PAnsiChar; count: size_t; format: PAnsiChar): Integer; cdecl;varargs; external 'MSVCRT.DLL' name '_vsnprintf';
Delphi 2010中用Delayed 属性实现DLL接口的延迟加载
Submitted by hubdog on Sun, 2009-11-15 08:41在Delphi2010的Windows.pas有下面的API定义
function CloseTouchInputHandle; external user32 name 'CloseTouchInputHandle' delayed;
CloseTouchInputHandle这个API是Windows7特有的API,在以前的Delphi版本中,一旦我们的程序使用了这个API,并且在Window7以外的操作系统上运行时,在加载的阶段就会报错。但是在Delphi2010上由于使用Delayed这个属性,则在运行时真正调用到了这个API的时候才会抛出异常。
Vista和拖放操作
Submitted by hubdog on Sat, 2009-11-14 20:13这两天为程序添加一个接收资源管理器中拖放过来的文件功能,结果发现一个问题,在Vista上通常权限的情况下,可以正常接收资源管理器的拖放,但是一旦程序提成权限为管理员时,就不能接受拖放了,查了一下原来是Vista的权限管理禁止在不同权限的进程间使用基于COM的拖放,这样会有安全漏洞。
Windows和Linux文件锁的不同
Submitted by hubdog on Sun, 2009-11-08 09:05测试文件发送Service时发现了一个Bug,在Windows上用写模式打开一个文件,默认会创建一个排他锁,也就是其它的应用无法同样用写模式打开一个文件。但是在Linux上运行的时候,Linux不会创建排他锁,导致发送的文件不完整。
查了一下,没有什么特别好的方法,后来改成一个先生成一个临时文件,然后将文件改名为真实文件来避免读写的不同步。
