edog

冰冻热狗
数据加载中……

置顶随笔

[置顶]用VC++6.0编程实现汉字拼音查找

     摘要: 用VC++6.0编程实现汉字拼音查找 eDog[原创] 摘要   使用VC++6.0编程查找汉字的拼音 关键字   汉字,拼音,资源 下载:http://www.cppblog.com/Files/edog/LookPY.rar 一、         &n...  阅读全文

posted @ 2005-11-30 00:25 冰冻热狗 阅读(7937) | 评论 (28)编辑 收藏

2013年10月18日

一个简单的Linux驱动程序和Makefile

1、源程序

//hello.c

1.     #include <linux/init.h>   

2.     #include <linux/module.h>   

3.       

4.     MODULE_LICENSE("Dual BSD/GPL");  

5.       

6.     static int hello_init(void)  

7.     {  

8.         printk(KERN_ALERT "hello module!\n");  

9.         return 0;  

10. }  

11.   

12. static void hello_exit(void)  

13. {  

14.     printk(KERN_ALERT "bye module!\n");  

15. }  

16.   

17. module_init(hello_init);  

18. module_exit(hello_exit);  

 

2、驱动程序介绍

一个linux内核模块主要由如下几个部分组成:

1module加载函数。

 

当通过insmodmodprobe命令加载内核module时,module的加载函数会自动被内核运行,完成本module的相关初始化工作。

 

module加载函数通过module_init()函数向内核注册。

 

2module卸载函数。

 

rmmod命令卸载某个模块时,模块的卸载函数会自动被内核执行,完成本模块初始化的相反功能。

 

module卸载函数通过module_exit()函数向内核注册。

 

3module许可声明(必须)

 

许可证license声明描述内核模块的许可权限,如果不声明license,模块被加载时,将,收到内核被污染(kernel tainted)的警告。linux中可接受的license包括“GPL”,“GPL v2”,“Dual BSD/GPL”,“Dual MPL/GPL”等。

 

多数情况下,内核模块应遵循GPL兼容许可权,2.6内核模块最常见的是以MODULE_LICENSE("Dual BSD/GPL")语句声明模块采用BSD/GPL LICENSE

 

4)模块参数(可选)

 

5)模块到处符号(可选)

 

6)模块作者等信息声明(可选),如MODULE_AUTHOR(),MODULE_DESCRIPTION(),MODULE_ALIAS()等。

 

编译得到hello.ko,然后insmod hello.ko加载模块,rmmod hello.ko 卸载模块。

 

 

linux内核的整体结构已经非常庞大,而其包含的组件也非常多,有两种方法把需要的部分都包含在内核中

 

一,把所有功能都编译进内核,但这回导致两个问题,生成的内核会特别打,假如要把现在的内核增加或删除功能,将不得不重新编译整个内核。

 

二,使用模块module,上述我们写的最简单驱动,就是一个模块module,可以随意的增加或删除。

 

3Makefile文件

怎样把hello.c源文件编译成helo.ko内核模块呢,同样使用make,但这里的Makefile与一般的应用程序Makefile有所不同,驱动Makfile要指定内核源代码位置,先看一个简单的驱动Makefile

1.     obj-m := hello.o  

2.     KERNEL_DIR := /lib/modules/$(shell uname -r)/build  

3.     PWD := $(shell pwd)  

4.     all:  

5.         make -C $(KERNEL_DIR) SUBDIRS=$(PWD) modules  

6.     clean:  

7.         rm *.o *.ko *.mod.c  

8.       

9.     .PHONY:clean  

KERNEL_DIR为内核源代码build目录,我们知道,内核存放在/usr/src中,/lib/modules其实是连接到这个地方,在shell中执行uname -r会得到正在使用的完整内核版本号,这样就选择了适当的内核源码。

PWD为源文件hello.c所在目录。

make -C (大写C make会进入KERNEL_DIR目录执行此目录下的Makefile,然后在返回PWD目录执行自己写的Makefile

4、在终端中make

1.     [root@localhost driver]# make  

2.     make -C /lib/modules/2.6.9-89.ELsmp/build SUBDIRS=/root/linux/driver modules  

3.     make[1]: Entering directory `/usr/src/kernels/2.6.9-89.EL-smp-i686'  

4.       CC [M]  /root/linux/driver/hello.o  

5.       Building modules, stage 2.  

6.       MODPOST  

7.       CC      /root/linux/driver/hello.mod.o  

8.       LD [M]  /root/linux/driver/hello.ko  

9.     make[1]: Leaving directory `/usr/src/kernels/2.6.9-89.EL-smp-i686'

这样hello.ko驱动模块就产生好了。

 

5insmod加载

1.      [root@localhost driver]# insmod hello.ko

6lsmod查看模块

lsmod一下就会看到hello模块的存在了,并且在系统的日志/var/log/messages中会记录模块的输出,也就是

1.     printk(KERN_ALERT "hello module!\n");  

输出的hello module

1.     <pre name="code" class="plain">[root@localhost driver]#tail -1 /var/log/messages  

2.     Oct 13 11:27:07 localhost kernel: hello module! 

7rmmod helle 卸载hello.ko

 

posted @ 2013-10-18 22:18 冰冻热狗 阅读(6395) | 评论 (0)编辑 收藏

2010年3月2日

字符设备驱动基本框架


#include 
<linux/init.h>
#include 
<linux/module.h> 
#include 
<asm/gpio.h>
#include 
<linux/moduleparam.h> 
#include 
<linux/mm.h>
#include 
<asm/io.h>

#define DEVICE_NAME        "LEDS"
#define NUM_MAJOR        240

MODULE_LICENSE(
"Dual BSD/GPL"); 

static int leds_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg)
{
    
return 0;
}


static struct file_operations fops = 
{
    owner: THIS_MODULE,
    ioctl: leds_ioctl,
}
;

static int leds_init(void

    
// 注册设备
    register_chrdev(NUM_MAJOR, DEVICE_NAME, &fops);    
    
return 0
}
 

static void leds_exit(void
{
    
// 注销设备
    unregister_chrdev(NUM_MAJOR,DEVICE_NAME);
}
 

module_init(leds_init); 
module_exit(leds_exit); 

posted @ 2010-03-02 14:38 冰冻热狗 阅读(303) | 评论 (0)编辑 收藏

2007年11月21日

一个串口通讯的类

     摘要: /**//* CommUtils.h */#ifndef _CommUtils_H__#define _CommUtils_H__class CommUtils  {public:    bool ReadCom(unsigned char * Re...  阅读全文

posted @ 2007-11-21 10:28 冰冻热狗 阅读(2954) | 评论 (4)编辑 收藏

一些常用函数

1、取当前路径
    char szCurPath[256];
    GetModuleFileName(NULL, szCurPath, 
256);
    
for(int i=strlen(szCurPath)-1; i>=0; i--)
    
{
        
if(szCurPath[i] == '\\')
        
{
            szCurPath[i
+1]=0;
            
break;
        }

    }

2、设置CListCtrl风格
m_List1.SetExtendedStyle(LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT | LVS_EX_HEADERDRAGDROP);

3、INI文件操作
char ss[20];
GetPrivateProfileString(
"COMM""BaudRate""", ss, 20, szCurPath);
WritePrivateProfileString(
"COMM""BaudRate", ss, szCurPath);

4、字符串转为16进制
void CommUtils::HexToChar(unsigned char *hex, int dwLength, char *buf)
{
    
int i;
    
char s[10];
    buf[
0]=0;
    
for(i=0; i<dwLength; i++)
    {
        sprintf(s, 
"%02X ", hex[i]);
        strcat(buf, s);
    }
}

posted @ 2007-11-21 10:12 冰冻热狗 阅读(379) | 评论 (0)编辑 收藏

2006年9月24日

WIN2000无人值守安装

1:消除WINDOWS2000安装过程中提示输入注册号的过程
  把WINDOWS2000安装文件拷贝到硬盘,打开i386目录下的setupp.ini,将PID后面的数字改成51873270,那么在整个安装过程中就不会有输入序列号的过程了。

2:实现WIN2000的无人值守安装
  在WINDOWS2000的安装盘上有一个SUPPORTTOOLS的目录,将其中的DEPLOY.CAB拷贝到硬盘,用WINZIP进行解压缩。然后运行其中的setupmgr.exe,WINDOWS2000会根据你的需要建立一个自动批处理文件。以后再安装WINDOWS2000,只需要在DOS下键入winnt[/s:安装文件目录][/u:自动安装文件名称]例如:
  d:i386winnt /B /u:d:setup.txt /s:d:i386
  表示使用D:下创建的setup.txt文件对WIN2000进行自动安装。

posted @ 2006-09-24 16:37 冰冻热狗 阅读(638) | 评论 (0)编辑 收藏

2006年6月14日

VC6书签管理插件

原文链接:http://www.codeproject.com/useritems/BookMarkMgr.asp


本程序为VC6.0的插件,在IDE中以工具条ToolBar的形式出现,接合Edit工具条使用,实现书签管理的功能(VC本身的书签在关闭文件后会丢失)。

此插件有三个按钮,提供打开/保存/编辑书签的功能:
1、保存和恢复书签,就算文件关闭了,下次打开时可以恢复书签。
2、编辑已存在的书签
3、重新打开一个已经关闭的文件时,自动查找原来已经保存的书签并重新设置书签。

此插件为DLL,下载链接为:
安装如下:
1、复制到硬盘某一位置
2、打开VC6.0的菜单“Tools->Customize”,选择“Add-Ins and macro Files”页
3、选择“Browse”按钮,选择本插件文件

至此,就可以使用了。

posted @ 2006-06-14 09:12 冰冻热狗 阅读(983) | 评论 (0)编辑 收藏

2006年6月11日

Asp的时间格式问题

现象:使用ASP取当前时间NOW,返回的时间带有上下午字样,导致无法写入datetime字段。
原因:安装了WIN2000番茄乐园版,该版本把系统时间修改为带上下午格式。

方法1:
1、控制面板--区域和语言选项--把时间设置为24小时格式。
2、打开注册表建立HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\OLEAUT\VarConversionLocaleSetting = 2 (DWORD)
备注:OLEAUT 项可能不存在。如果它不存在,则必须先创建该项。
3、重新启动IIS。

问题解决,原理是强制使asp时间使用区域格式。


方法2:
查找注册表,全部匹配,把iTime的值全部改成1 。
然后修改服务器系统时间,重起机器完全正常了~
(此方法试过好像不行)

posted @ 2006-06-11 13:39 冰冻热狗 阅读(1219) | 评论 (0)编辑 收藏

2006年5月3日

函数的多参量处理

函数需要输入多个参数时,象sprintf的用法一样:

void  WriteLog2( bool  bNeedTime,  const   char   * fmt, )
{
    
if  (fpLog  ==  NULL)     return ;
    SYSTEMTIME tm;
    GetLocalTime(
& tm);
    
if  (bNeedTime)
    
{
        fprintf(fpLog, 
" %02d:%02d:%02d.%03d\t " , tm.wHour, tm.wMinute, tm.wSecond, tm.wMilliseconds);
    }


    va_list pArg;
    va_start(pArg, fmt);
    fprintf(fpLog, fmt, pArg);
    va_end(pArg);

    fputs(
" \n " , fpLog);
}

 

posted @ 2006-05-03 00:29 冰冻热狗 阅读(375) | 评论 (0)编辑 收藏

2006年3月15日

用VS2003调试ASP的方法和体会

一直以来,和很多朋友一样,我调试ASP一般都是用editplus,当然,界面部分还是要用用什么frontpage之类的啦。 前段时间写.net项目,装了一个VS.net2003,最近要写一个asp的项目,后来想想用vs20003来试试吧。
1、打开VS2003,先新建立一个项目,选Visual Basic项目--空WEB项目,名字就叫webproject1,然后可以在资源管理器(是VS的不是windows的)里看到解决方案。


2、点项文件栏上的"项目",然后点"webproject1属性"--"配置属性"--"调试"里,把"ASP.NET调试"去掉,把"ASP"调试打开。 


3、右键webproject1,添加新项---WEB窗体,名称叫index.asp(注意名称不是aspx,是asp)。然后可以看到index.asp的HTML处理编辑状态。
4、把现成的代码全部删除,因为这个是VS自动生成的,当中有些代码是用于asp.net的。然后你就可以自由编写你的ASP页面了。在编写代码的时候,VS会提供一些自动完成功能,很方便的。
 
5、现在准备调试。在资源管理器中index.asp,右键,设置为起始页。
6、然后点工具栏上的"三角"(哈哈,就是播放键)啦,这个就是debug的调试。
7、然后会跳出一个窗口让你输入本机密码,你就输入你登录用户的密码好了。 IE跳出来了,页面中显示出"VS下调试ASP项目",哈,调试成功了!
 
结束调试的话你可以在VS里点工具栏上的那个"方块"(就是停止调试),也可以直接把IE关掉,也会自动停止调试的。

好了,下面来谈谈我的一点经验和体会吧。
1、VS调试ASP程序比较慢,这个慢是体现在打开IE页面时,所以我建议一般的写代码和编程就在VS里,调试的时候就像以前那样,直接开个IE进行调试。但是,对于复杂的问题,涉及到流程错误的,我还是喜欢在VS里用单步调试,用F9在某个地方设个断点,然后用F10进行跟踪,这样对于程序的流程,变量值都可以很好的看出来(这些调试技巧大家可以参考一些asp.net方面的书,或是以前的VS6的书也行),解决复杂问题也就快了许多。

2、建立新页面文件时,我建议还是直接进到目录中,然后建立好,再到VS的资源管理器中,用添加现有项进行导入,这样建立的文件没有垃圾代码。

3、VS2003可以提供很好的自动完成功能,大家可以充分的利用。

4、VS.net可以实现控件拖放加载,你可以在左边的"工具箱"--"HTML"里可以看到,直接点了,按住MOUSE左键直接拖到你想添加的地方。由于VS.net是针对.net的,所以一些HTML控件的属性中也体现了这些,比如"runat"这样的属性,在asp中是根本用不起来的。不过大多数控件的属性都是可以的,而且可以在"设计"视图下进行方便的设置属性好啦就说这么多吧. 大家可以慢慢体会:)有人说DW不错,我没有用过,不知道怎么样,也有人说DW有不少垃圾代码,呵呵:P

本文摘录自:http://www.81819.com/Article/2004-3-1/news2004-6-2535008925.html

 

posted @ 2006-03-15 00:08 冰冻热狗 阅读(883) | 评论 (4)编辑 收藏

2006年2月15日

C/C++程序内存泄漏检测

1. 包含头文件和定义:
#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
如果定义了_CRTDBG_MAP_ALLOC,打印出来的是文件名和行数等更加直观的信息。

2. 方法一
在程序入口写几个语句:
 int tmpFlag = _CrtSetDbgFlag( _CRTDBG_REPORT_FLAG );
 tmpFlag |= _CRTDBG_LEAK_CHECK_DF;
 _CrtSetDbgFlag( tmpFlag );
程序退出时,如果发现有内存泄漏,会自动在DEBUG OUTPUT窗口和DebugView中输出内存泄漏信息。

3. 方法二
在程序任何地方用以下语句:
_CrtDumpMemoryLeaks();
随时检测打印内存泄漏信息,如果有的话。不过此用法有个局限,对于一些全局函数,如果初始化时申请了内存,到程序结束时候才释放,此函数会一直把新申请的内存当作泄漏来对待。

4. 方法三
使用_CrtMemCheckpoint方法,在某段程序中统计泄漏信息。如下:
 _CrtMemState s1, s2, s3;
 _CrtMemCheckpoint( &s1 );
 
 // 程序段1:DO SOMETHING

 _CrtMemCheckpoint( &s2 );
 if ( _CrtMemDifference( &s3, &s1, &s2) )
  _CrtMemDumpStatistics( &s3 );

可以统计程序段1中是否发生了内存泄漏。

posted @ 2006-02-15 14:36 冰冻热狗 阅读(3140) | 评论 (0)编辑 收藏