博文
VC 中遍历文件夹(2010-02-09 10:23:00)
摘要:在VC编程中,时常会需要遍历某个文件夹中的文件或者文件夹。这个本身是个非常容易的事。可是我每次都不能完整的记下怎么遍历(可能年龄大了容易忘事)。这样每次就需要重新查询一次。这样不但浪费时间,还有时不能很快查到结果。这里就把这段代码记录下来,免得下次查询,也可以供需要查询的人直接拷贝利用。
find(char * lpPath)
{
char szFind[MAX_PATH];
WIN32_FIND_DATA FindFileData;
strcpy(szFind,lpPath);
strcat(szFind,"\\*.*");
HANDLE hFind=::FindFirstFile(szFind,&FindFileData);
if(INVALID_HANDLE_VALUE == hFind) return;
while(TRUE)
{
if(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
if(FindFileData.cFileName[0]!='.')
{
 ......
VS 2005 下配置Windows 驱动开发环境心得(2010-01-28 16:55:00)
摘要:所谓万事开头难,自己参照《windows驱动开发技术详解》、在网上收集一些资料,终于在VS2005成功配置开发环境。
网上大多讲述的是 VC6.0 还有就是利用 ddkwizard 插件配置环境,VC6.0的配置跟VS2005还是有很大不同的,又因为是初学者觉得用ddkwizard 帮助我们做了很多工作,不利于学习。所以自己一步步在VS2005配置。在这里列出仅供参考:
预备工作:
1、安装了DDK(呵呵,说句废话)。目录名字最好不要带空格;
2、在VS2005中选择 “生成”|“配置管理器” ---在活动解决方案配置中 新建一个方案名(不要Debug、Release);
3、选择 ”工具“|”选项“菜单 选择”项目和解决方案“ 选项卡,选择“VC++目录”选项卡 在”显示以下内容的目录“下拉菜单中选择”包含文件“菜单 添加”"C:\WinDDK\5112\inc\crt", "C:\WinDDK\5112\inc\mfc42", "C:\WinDDK\5112\inc\ddk" 和 "C:\WinDDK\5112\inc\api" , 选择”库文件“菜单添加”C:\WinDDK\5112\lib\wxp\i386"。 不同版本的WDM对应中间的数值会不同,我这里是5112, 你的可能不是这个版本,那么这个数值就不同。
接下来就是工程配置属性项
4、选择”项目“|”属性“ 弹出”属性页“对话框 选择”配置属性“选项卡 选择“C/C++”选项卡
4.1、再选择”常规“选项卡
&n......
IoAttachDevice和IoAttachDeviceToDeviceSta(2010-01-27 11:02:00)
摘要:
转至某位大侠的主页。这里记不清楚了,请勿见怪。
IoAttachDevice和IoAttachDeviceToDeviceStack 基础解说以及实现
基本解说:
引用内容
IoAttachDevice
NTSTATUS
IoAttachDevice(
IN PDEVICE_OBJECT SourceDevice,
IN PUNICODE_STRING TargetDevice,
OUT PDEVICE_OBJECT *AttachedDevice
);
SourceDevice是要挂上的设备,TargetDevice是目标设备
执行结果:SourceDevice将挂载TargetDevice设备栈的最上层
返回值:是这个设备栈SourceDevice的下层,也就是不一定是TargetDevice,除非TargetDevice原本是最上层的。
疑问:IoAttachDevice的 AttachedDevice 难道就是返回 TargetDevice?而不是下一层? msdn也没有说明
IoAttachDevice IoAttachDeviceToDeviceStack挂载C到A上面
实验结果:
1、两个函数都是挂载到设备栈的最上层。如图:
2、IoAttachDevice 的输出值 OUT PDEVICE_OBJECT *AttachedDevice 以及 IoAttachDeviceToDeviceStack的返回值都是设备B的指针
结论:
说明两个函数的效果是一样的,不过IoAttachDevice 底层调用的还是IoAttachDeviceToDeviceStack......
cdecl 和 stdcall(2010-01-20 13:43:00)
摘要:
__cdecl
__stdcall
C 和 C++ 程序的缺省调用规范
为了使用这种调用规范,需要你明确的加上 __stdcall (或 WINAPI )文字。即 return-type __stdcall function-name[(argument-list)]
在被调用函数 (Callee) 返回后,由调用方 (Caller) 调整堆栈。
1. 调用方的函数调用
2. 被调用函数的执行
3. 被调用函数的结果返回
4. 调用方清除调整堆栈
在被调用......
const用法(2009-12-18 14:55:00)
摘要:const 成员函数
任何不会修改数据成员的函数都应该声明为const 类型。如果在编写const 成员函数时,不慎修改了数据成员,或者调用了其它非const 成员函数,编译器将指出错误,这无疑会提高程序的健壮性。以下程序中,类stack 的成员函数GetCount 仅用于计数,从逻辑上讲GetCount 应当为const 函数。编译器将指出GetCount 函数中的错误。
class Stack
{
public:
void Push(int elem);
int Pop(void);
int GetCount(void) const; // const 成员函数
private:
int m_num;
int m_data[100];
};
int Stack::GetCount(void) const
{
++ m_num; // 编译错误,企图修改数据成员m_num
Pop(); // 编译错误,企图调用非const 函数
return m_num;
}
const 成员函数的声明看起来怪怪的:const 关键字只能放在函数声明的尾部,大概是因为其它地方都已经被占用了。
关于Const函数的几点规则:
a. const对象只能访问const成员函数,而非const对象可以访问任意的成员函数,包括const成员函数.
b. const对象的成员是不可修改的,然而const对象通过指针维护的对象却是可以修改的.
c. const成员函数不可以修改对象的数据,不管对象是否具有const性质.它在编译时,以是否修改成员数据为依据,进行检查.
e. 然而加上mutable修饰符的数据成员,对于任何情况下通过任何手段都可修改,自然此时的const成员函数是可以修改它的
......
FreeSpan 和 PrefixSpan 算法对比(2009-10-10 16:28:00)
摘要:在序列模式挖掘中,FreeSpan和PrefixSpan是两个常用的算法。其中,PrefixSpan是从FreeSpan中推导演化而来的。这两个算法都比传统的Apriori-like的序列模式挖掘算法(GSP)都有效。而PrefixSpan又比FreeSpan又更有效。这是因为PrefixSpan的收缩速度比FreeSpan还要更快些。
下面将分别介绍这两种算法
1. FreeSpan算法
FreeSpan算法的核心思想是分治算法。下面通过一个例子来描述:
假设有一个序列数据库有如下四条序列记录
首先求得一项频繁集合为 a(4) b(4) c(4) d(3) e(3) f(3)
然后,频繁序列肯定是以这两个元素为开始的。
下面以求 a 开头的频繁序列模式为例子,
包含六中可能
(1) 序列中只包含a
(2) 序列中只包含 a , b
(3) 序列中只包含 a , b , c
(4) 序列中只包含 a , b , c, d
(5) 序列中只包含 a , b , c, d, e
(6) 序列中只包含 a , b , c, d, e , f
在求第一种可能的时候,对数据库中的每条序列记录来说,去掉不包含在一项频繁集合中的元素,并且去掉 a 以外的元素。得到映射数据库为:
这里,求二项集合,可见,次数为2,是频繁序列。就这一个二项频繁序列,没有三项或以上的频繁序列。
求第二中情况, 同样,去掉非频繁元素及 a , b 以外的其他元素。
可见,该情况下有三个频繁二项序列。 为 ab(4), ba(2), (ab)(2)。 然后,再扫描一遍该映射数据库,分别从二项频繁序列中扩展三项频繁序列集,得到一项频繁三项序列为 aba(2)
同样,将其他集中情况一次的求解。得到以a 开始的频繁序列集。然后分别求以 b, d, e, f开头的频繁序列。就得到了所有的频繁序列集合。
2. PrefixSpan 算法
还以上面这个序列数据库为例,开头还是一样,
首先求得一项频繁集合为 a(4) b(4) c(4) d(3) e(3) f(3)
然后,频繁序列肯定是以这两个元素为开始的。
下面以求 a 开头的频繁序列模式为例子,
求的 a 的映射数据库为
......
gtk+ 下绘图及图片显示相结合并对图像进行缩放(2009-08-07 16:07:00)
摘要:这方面的资料确实比较少,通过自己摸索,实现了在GTK+ 2.0下进行图片显示,然后在图片上可以自己绘图的一个程序。啥也不说了,发上源码,以供大家参考。希望对学习GTK+的人有点帮助。
#include <gtk/gtk.h>
#include <stdlib.h>
#include <gdk-pixbuf/gdk-pixbuf.h>
#define DA_WIDTH 300
#define DA_HEIGHT 300
#define SCALE_FACTOR 1.2
#define PEN_MOVE 0
#define PEN_UP 1
#define PEN_DOWN 2
GdkPixmap *pixmap = NULL;
GtkWidget *window, *vbox, *tool_bar, *drawing_area;
gboolean status;
gboolean fdiscard = TRUE;
gint prev_x, prev_y;
GdkGC *my_gc_red;
GdkColor color;
struct ImageData {
GtkWidget *drawing_area;
int width, height;
GdkPixbuf *pixbuf;
float scale;
};
struct ImageData data;
static void expose_cb(GtkWidget *da, GdkEventExpose *event, struct ImageData *data)
{
gdk_pixbuf_render_to_drawable_alpha(data->pixbuf, da->window, 0, 0,
0, 0, data->width, data->heigh......
GTK 2.0 界面设计工具---glade(2009-07-29 16:03:00)
摘要:注:转自http://www.cqinc.com.tw/coopermaa/xwindow/2000010201.htm
Glade 入門介紹
Introduction
在了解 Glade 之前,我想你應該先了解一下 GTK+ 與 Glade 之間的關係:
GTK+ (GIMP Tool Kit) 是一套圖形函式庫 (GUI, Graphical User Intreface),可用來建立 X Window System 以圖形為基礎 (GUI-based) 的應用程式。一開始 GTK+ 是寫來給 GIMP (GNU Image Manipulation Program) 圖形處理軟體使用的,不過隨著 GNU/Linux 與 GNOME Desktop (使用了 GTK+) 的流行, GTK+ 圖形庫已經慢慢普遍使用在各種工具中。
雖然有了 GTK+,但是要用 GTK+ 來撰寫程式並不是一件輕鬆的事,因為要完成一個 GUI-based 的應用程式,得靠自己用熟悉的文書編輯器,一行一行把 C 程式碼敲出來。如果你是個抽象思考力非常好,又很有耐性寫程式碼的人,也許只要幾個小時就能把 GTK+ 摸透;但如果你和我一樣也是個懶墮的傢伙,我想能撐個一小時來弄清楚 GTK+ 有什用,就可算是一件非常了不起的事了 :-)。還好,Glade 的出現讓我在想放棄前有了回心轉意的念頭。
Glade 是 GTK+ 圖形使用者介面產生器 (User Interface Builder for GTK+). 也就是說,Glade 是個 Visual Programming Tool,和 Microsoft Windows 平台的 Visual Tools (VB、Delphi) 類似,只要用滑鼠拉一拉,它就會自動幫你產生 C source code。所以我們這些懶人,就不用再去為畫面的設計煩腦,用 Glade 設計好畫面,再用編輯器把程式碼稍為修修減減就 OK 了。(現在也有各種語言如 C++、Ada95、Python、Perl 等的 GTK+ 介面,如果再搭配其它工具,也可以自動產生 C++, Ada95, Python and Perl 的程式碼)。
本文概括性的介紹如何用 Glade 來建立使用者介面,同時也包含了用 G......
Linux下动态库只导出部分函数(2009-07-09 15:27:00)
摘要:编译一个1.c文件:
#include "stdio.h"
#if defined(__GNUC__) && \
((__GNUC__ >= 4) || (__GNUC__ == 3 && __GNUC_MINOR__ >= 3))
#define NP_VISIBILITY_DEFAULT __attribute__((visibility("default")))
#else
#define NP_VISIBILITY_DEFAULT
#endif
#define NP_EXPORT(__type) NP_VISIBILITY_DEFAULT __type
NP_EXPORT(int) a()
{
printf("1.c i am a\0");
return 0;
}
int b()
{
return 0;
}
我的目的是默认没有使用NP_EXPORT宏的函数都隐藏起来,即把b函数给隐藏起来,而a函数则导出去。
我的编译步骤和指令如下:
gcc -c 1.c
gcc –fPIC -shared -fvisibility=hidden -o 1.so 1.o
编译后生成了1.so文件。
我使用nm工具查看,这个时候就可以达到隐藏不必要的函数,而只是导出定义过的函数。
......
难搞的typename用法(2009-03-14 16:58:00)
摘要:注: 转载至 http://www.kuqin.com/cpluspluslib/20071210/2872.html
/*******************************************************************************
* SGI*STL是STL之父Alexander Stepanov和STL巨匠Matt Austern等人的作品, 是当今 *
* 最富盛名、最出色的STL实现版本,全部源代码和说明文档可从http://www.sgi.com/STL/ 下*
* 载, 是我们学习STL的最佳范本. 但是众所周知, STL使用了大量复杂艰深的C++特性, *
* 加上STL本身的复杂和庞大, 使得阅读代码本身就成为一件非常困难的工作. 以下文 *
* 字是我在学习STL过程中得到的一些经验和猜测, 希望能对大家有所帮助, 更希望能 *
* 得到大家的批评和指正, 以利于我们的共同提高. *
* ......