posts - 29, comments - 41, trackbacks - 1, articles - 0
  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理

公告

2009年6月23日

在 c++ 或者 c 的源代码中,经常看到 extern "C"这样的写法,主要原因是各个编译器的名字改编方式不同,下面是来自:
http://blog.csdn.net/vinep/archive/2009/02/17/3899780.aspx 一篇原文,粘贴一下,已备查看。
 

以int func(int, int)为例,C的编译器会将名字改编为_func, 而C++的编译器会改编为_func_int_int 或_funcii(各编译器不同)。如果这个函数在C中编译成库,目标文件中函数名为_func,当这个函数中C++中被调用时,C++的编译器就会到目标文件中寻找_funcii,结果找不到,出错。所以为了防止这种问题,在C++调用时,将函数声明前加个extern "C" 告诉C++的编译器,不要对名字再进修饰,而直接去找_func。因为C、C++的编译器对函数名的修饰不同,为了保证在C、C++中编写的函数能够被互相调用,所以采用这个

链接指示符

同样在C++中编译的函数,如果想让C来使用,通常也加上extern "C"在编译时将函数名按C的风格进行修饰。通常C中编写的函数如果有在其它语言中使用的可能,通常会有下面形式的声明:#ifdef  __cplusplusextern "C" {#endif/**** some declaration or so *****/#ifdef  __cplusplus    }#endif  /* end of __cplusplus */即在声明时已经加上extern "C" 而不需要调用时麻烦。例如在VC++中调用C的库函数就不用作特别的声明。extern "C"的使用要点

 


 

 

 

 

 

 

 


1. 可以是单一语句
    extern "C" double sqrt(double);
2. 可以是复合语句, 相当于复合语句中的声明都加了extern "C"
    extern "C"
   {
      double sqrt(double);
      int min(int, int);
  }
3.可以包含头文件,相当于头文件中的声明都加了extern "C"
   extern "C"
  {
    #i nclude <cmath>
  }
4. 不可以将extern "C" 添加在函数内部
5. 如果函数有多个声明,可以都加extern "C", 也可以只出现在第一次声明中,后面的声明会接受第一个链接指示符的规则。
6. 除extern "C", 还有extern "FORTRAN" 等。

posted @ 2009-06-23 09:52 sashow 阅读(167) 评论(0) 编辑

2009年6月11日

用户交互操作最好描述为控件创建和响应的各种事件。一些比较常见的事件有Click、DoubleClick、KeyDown、KeyPress、Validating和Paint。

鼠标事件Click、DoubleClick、MouseDown、MouseUp、MouseEnter、MouseLeave和 MouseHover处理鼠标和控件的交互操作。如果处理Click和DoubleClick事件,每次捕获一个DoubleClick事件时,也会引发 Click事件。如果处理不正确,就会出现我们不希望的结果。Click和DoubleClick事件都把EventArgs作为其参数,而 MouseDown和MouseUp事件把MouseEventArgs作为其参数。MouseEventArgs包含几个有用的信息,例如单击的按钮、 按钮被单击的次数、鼠标轮制动器(鼠标轮上的凹槽)的数目和鼠标的当前XY坐标。如果可以访问这些信息,就必须处理MouseDown或MouseUp事 件,而不是Click或DoubleClick事件。

键盘事件的工作方式与此类似:需要一些信息来确定处理什么事件。对于简单的情况,KeyPress事件接收一个 KeyPressEventArgs,它包含表示被按键的字符值KeyChar。Handled属性用于确定事件是否已处理。把Handled属性设置为 true,事件就不会由操作系统进行默认处理。如果需要被按的键的更多信息,则处理KeyDown或KeyUp事件会比较合适。它们都接收 KeyEventArgs。KeyEventArgs中的属性包括Ctrl、Alt或Shift键是否被按下。KeyCode属性返回一个Keys枚举 值,表示被按下的键。与KeyPressEventArgs.KeyChar不同,KeyCode属性指定键盘上的每个键,而不仅仅是字母数字键。 KeyData属性返回一个Key值,还设置修饰符。修饰符与值进行OR运算,指定是否同时按下了Shift或Ctrl键。KeyValue属性是 Keys枚举的整数值。Modifiers属性包含一个Keys值,它表示被按下的修饰符键。如果选择了多个修饰符键,这些值就进行OR运算。键盘事件以 下述顺序来引发:

(1) KeyDown

(2) KeyPress

(3) KeyUp

Validating、Validated、Enter、Leave、GotFocus和LostFocus事件都处理获得焦点(或被激活)和失去 焦点的控件。在用户用tab键选择一个控件或用鼠标选择该控件时,该控件就获得了焦点。Enter、Leave、GotFocus和LostFocus事 件的功能似乎非常类似。GotFocus和LostFocus事件是低级事件,与Windows消息WM_SETFOCUS和WM_KILLFOCUS相 关。一般应尽可能使用Enter和Leave事件。Validating和Validated事件在验证控件时发生。这些事件接收一个 CancelEventArgs,利用该参数,把Cancel属性设置为true,就可以取消以后的事件。如果定制了验证代码,而且验证失败,就可以把 Cancel属性设置为true,且控件也不会失去焦点。Validating事件在验证过程中发生,Validated事件在验证过程后发生。这些事件 的引发顺序如下:

(1) Enter

(2) GotFocus

(3) Leave

(4) Validating

(5) Validated

(6) LostFocus

理解这些事件的引发顺序是很重要的,可以避免不小心创建递归事件。例如,在控件的LostFocus事件中设置控件的焦点,就会创建一个消息死锁,且应用程序会停止响应。

posted @ 2009-06-11 22:27 sashow 阅读(117) 评论(0) 编辑

2009年6月9日


((((留存 )))))))

gpedit.msc-------------------------组策略 
explorer-------------------------打开资源管理器 
logoff--------------------------注销命令 
tsshutdn-------------------------60秒倒计时关机命令 
services.msc-------------------------本地服务设置 
oobe/msoobe /a----------------------检查xp是否激活 
notepad--------------------------打开记事本 
cleanmgr-------------------------垃圾整理 
net start messenger-----------------开始信使服务   
net stop messenger-----------------停止信使服务 
conf-------------------------启动 
charmap-------------------------启动字符映射表 
diskmgmt.msc-------------------------磁盘管理实用程序 
calc-------------------------启动计算器 
dfrg.msc-------------------------磁盘碎片整理程序 
chkdsk.exe-------------------------chkdsk磁盘检查 
devmgmt.msc--- ----------------------设备管理器 
regsvr32 /u *.dll-------------------停止dll文件运行 
drwtsn32------ -------------------系统医生 
rononce -p ------------------------15秒关机 
dxdiag-------------------------检查directx信息 
regedt32-------------------------注册表编辑器 
msconfig.exe-------------------------系统配置实用程序 
rsop.msc-------------------------组策略结果集 
mem.exe-------------------------显示内存使用情况 
regedit.exe-------------------------注册表(16位那个) 
winchat-------------------------xp自带局域网聊天 
progman-------------------------程序管理器 
winmsd-------------------------系统信息 
perfmon.msc-------------------------计算机性能监测程序 
winver-------------------------检查windows版本 
sfc /scannow-----------------------扫描错误并复原 
wmimgmt.msc-------------------------打开windows管理体系结构 
wupdmgr-------------------------windows更新程序 
w脚本---------------------------windows脚本宿主设置 
write-------------------------写字板 
wiaacmgr-------------------------扫描仪和照相机向导     
mplayer2-------------------------简易 
mspaint-------------------------画图板 
mstsc-------------------------远程桌面连接 
mplayer2-------------------------媒体播放机 
magnify-------------------------放大镜实用程序 
mmc-------------------------打开控制台 
mobsync-------------------------同步命令 
dxdiag-------------------------检查directx信息 
drwtsn32------------------------- 系统医生
devmgmt.msc-?----------------------设备管理器 
dfrg.msc-------------------------磁盘碎片整理程序 
diskmgmt.msc-------------------------磁盘管理实用程序 
dcomcnfg-------------------------打开系统组件服务 
ddeshare-------------------------打开dde共享设置 
dvdplay-------------------------dvd播放器 
nslookup-------------------------网络管理的工具向导 
ntbackup-------------------------系统备份和还原 
narrator-------------------------屏幕“讲述人” 
nyessmgr.msc-------------------------移动存储管理器 
nyessoprq.msc-------------------------移动存储管理员操作请求 
netstat -an------------------------(tc)命令检查接口 
syncapp-------------------------创建一个公文包 
sysedit-------------------------系统配置编辑器 
sigverif-------------------------文件签名验证程序 
sndrec32-------------------------录音机 
shrpubw-------------------------创建共享文件夹 
secpol.msc-----====================本地安全策略 
syskey---------================系统加密,一旦加密就不能解开,保护
                                                                          windows xp系统的双重密码 
services.msc---======================本地服务设置 
sndvol32-------==================音量控制程序 
sfc.exe--------=================系统文件检查器 
sfc /scannow---======================windows文件保护 
tourstart------===================xp简介(安装完成后出现的漫游xp程序) 
taskmgr--------=================任务管理器 
eventvwr-------==================事件查看器 
eudcedit-------==================造字程序 
packager-------==================对象包装程序 
perfmon.msc----=====================计算机性能监测程序 
progman--------=================程序管理器   
regsvr32 /u *.dll----===============停止dll文件运行 
regsvr32 /u zipfldr.dll------=========取消zip支持 
cmd.exe--------=================cmd命令提示符 
chkdsk.exe-----====================chkdsk磁盘检查 
ceryesgr.msc----=====================证书管理实用程序   
cliconfg-------==================sql server 客户端网络实用程序 
clipbrd--------=================剪贴板查看器 
compmgmt.msc---======================计算机管理 
cleanmgr-------==================垃圾整理 
ciadv.msc------===================索引服务程序 
osk------------=============打开屏幕键盘 
odbcad32-------==================odbc数据源管理器 
oobe/msoobe /a----==================检查xp是否激活 
lusrmgr.msc----=====================本机用户和组 
logoff---------================注销命令 
iexpress-------==================木马捆绑工具,系统自带 
nslookup-------==================ip地址侦测器 
fsmgmt.msc-----====================共享文件夹管理器 
utilman--------=================辅助工具管理器

posted @ 2009-06-09 20:02 sashow 阅读(50) 评论(0) 编辑

2009年6月8日

一个端口扫描程序就是对一段区域内的端口进行连接测试,如果能够连接上则标识这个端口是开放的。为了简化程序,我只是TCP连接方式的 端口进行扫描。为了加快扫描速度,我需要使用多线程,用ThreadPool对线程进行维护。

首先,定义一个端口扫描的类,该类实现对指定地址、指定端口进行扫描,并将扫描的结果(能、不能连接)保存 ,代码如下:(注意,为了加快端口扫描的速度,我对 Socket 的Connect采用异步方式,而信号灯等待1秒仍然没有得到结果,就认为没有连接到对方主机)

Code

 

 接下来就是,在多线程的环境中执行Scan了,代码如下:

Code

 

呵呵,这里用了比较 bt 的办法, WaitHandle.WaitAll (autoEvents);这是为了前面讲的原理写的,而为了不那么bt可以采用推拉窗技术。

 

好了,就说了这么多,一则希望能对大家有所帮助,二则希望自己将来写程序的时候,能够很快的进入状态。

posted @ 2009-06-08 20:55 sashow 阅读(500) 评论(0) 编辑

   很久没有接着写这个系列的东西了,自己拿起来,还有些恍惚,因为有二年多的时间没有进行代码的编写了。

 

 上次解决了如何象线程传入参数,但是没有解决在主线程中获取发生了变化的参数的问题,引起这个问题的原因有两个:

1、线程池中的线程的启动、终止不是由我们设计的程序来控制的;

2、线程池中的线程执行完成后是没有返回值的。(这实际上与操作系统的线程调度和内存分配策略有关)

所以要想取得返回值,就需要解决这两个问题。

对于第一个问题,我们很容易想到操作系统提供的一种机制 “信号灯”(也有叫“信号量”、“信号”的),操作系统提供的这种机制允许进程之间进行通讯,呵呵,这样我们就可以让子线程与主线程进行通讯了。

对于第二个问题,由于线程没有返回值,我们可以传递给线程的参数中设置一个字段用于存储返回值,也可以通过通过获取 WaitCallBack 方法所在类的属性来获取(当然,在线程中这个属性是对其进行了改变的)。

现在,简单的说一下“信号灯”机制,打一个跟厕所有关的比喻,(不是很雅^_^),在火车上,当A上厕所的时候,他会将厕所的门锁上,对外标识一个“有人”的表示,当他解决完以后,他会打开门,“有人”的标识就会变成“无人”的标识,这样B就可以进去了,而如果A不把这个标识改变,B就算憋死也进不去的。(当然暴力方式排除在外)。C# 提供的 AutoResetEvent就是这样一种“信号灯”,定义这个类的变量,并传递到子线程,在子线程将结束时,将该“信号灯”设置为 true(“无人”)状态,这样主线程就可以进入了(开始执行)。

同样,我们还有上公共厕所的经历,在公共厕所了有很多个便池,当然还有一个厕所管理员,这时,A1,A2,A3……就可以在厕所管理员这里领取一个牌匾,同时进去解决“问题”, 如果,厕所管理员不是很bt,当A1出来的时候,他会放B1进去,但是也有Bt的,非得等到A1,A2,A3……都解决问题了,才让B1,B2,……进去,这就是WaitHandle.WaitAll()和WaitHandle.WaitAny(),WaitHandle.WaitOne()的区别,这是可以使用ManualResetEvent的“信号灯”

当然,还有一些线程之间也会争用资源,要达到同步的话,可以使用Monitor,Mutex的“信号灯”。

总之,信号灯机制提供了一个对子线程与主线程,子线程与子线程之间进行通讯的机制,这些通讯机制的共同特点是某个线程释放了资源(给出一个信号),其他的线程(主线程)才开始执行。

 

接着,我用一个端口扫描的程序来具体说明一下。

 

posted @ 2009-06-08 20:38 sashow 阅读(777) 评论(2) 编辑

2009年5月25日

在VS2005中希望Label标签实现换行的功能:

直接在修改代码,Label.Text ="www\r\nyyyyyy",这样Label中就会显示成如下样式:

www

yyyyyy

切忌不能在设计器中输入"\r\n"这样的字符,它会直接显示成 如下样式:

 www\r\nyyyyyy,也就是在设计器中不对转义字符进行处理。

 

在VS2005中希望 .resx 文件中的字符串分行显示,采用"shift+回车”对字符串进行分行。

同样,在.resx文件中不会对转义字符进行处理。

posted @ 2009-05-25 14:59 sashow 阅读(389) 评论(0) 编辑

2009年5月21日

摘要: W= (d+2*m+3*(m+1)/5+y+y/4-y/100+y/400) mod 7在公式中d表示日期中的日期,m表示月份数,y表示年数。  注意:在该公式中要把一月和二月看成是上一年的十三月和十四月,例:如果是2004-1-10则换算成:2003-13-10来代入公式计算。下面是 C#的代码实现[代码]阅读全文

posted @ 2009-05-21 14:51 sashow 阅读(214) 评论(0) 编辑

2009年4月29日

摘要: 在当前目录下所有文件中查找内容包含 string 的文件:find ./ -name "*" -exec grep "string" {} ";注意:在最后不能加 print ,否则会出错.在目录下包含子目录查找包含一定字符串的文件Find . –name *.c –exec grep –l ‘youstr {}上边的命令中name后必须是一个规定了...阅读全文

posted @ 2009-04-29 12:36 sashow 阅读(146) 评论(0) 编辑

2008年4月24日

摘要: 一个列的数据类型是 int ,从 1 开始自动增长,另一个列是字符串,现在想把 int 列转换成 五个字符,比如 1 转换后就是 00001 ,添到字符串列,怎么实现呢?update tablename set field_name=right(str(field_name+100000),5)阅读全文

posted @ 2008-04-24 21:08 sashow 阅读(3776) 评论(0) 编辑

2008年4月15日

摘要: 在利用Socket 进行Tcp/Ip 编程的时候,免不了要进行数据的发送和接收,而数据的接收,用得最多的就是 Socket 的同步函数 Receive (或它的重载):publicintReceive(byte[]buffer,intoffset,intsize,SocketFlagssocketFlags)或者是异步函数 BeginReceive( 或它的重载):publicIAsyncResu...阅读全文

posted @ 2008-04-15 00:40 sashow 阅读(1433) 评论(0) 编辑