:: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

一、
1、类型不同
BOOL为int型
bool为布尔型
2、长度不同
bool只有一个字节
BOOL长度视实际环境来定,一般可认为是4个字节
3、取值不同
bool取值false和true,是0和非0的区别
BOOL取值FALSE和TRUE,是0和1的区别

二:
bool是标准C++数据类型,可取值true和false。单独占一个字节,
如果数个bool对象列在一起,可能会各占一个bit,这取决于编译器。

BOOL是微软定义的typedef int BOOL。与bool不同,它是一个三值逻辑,
TRUE/FALSE/ERROR,返回值为>0的整数为TRUE,0为FALSE,-1为ERROR。
Win32 API中很多返回值为BOOL的函数都是三值逻辑。比如GetMessage().
三:
大BOOL和小bool之间的区别:
1、类型不同
BOOL为int型
bool为布尔型
2、长度不同
bool只有一个字节
BOOL长度视实际环境来定,一般可认为是4个字节
3、取值不同
bool取值false和true,是0和1的区别
BOOL取值FALSE和TRUE,是0和非0的区别
4、例子
bool x=3;  //告警
bool x=1;  //正确
BOOL x=3;  //正确
BOOL x=3.3;  //告警
注:windows为了兼容问题定义的基础变量。
typedef unsigned long        DWORD;
typedef int                  BOOL;
typedef unsigned char        BYTE;
typedef unsigned short      WORD;
typedef float                FLOAT;
typedef FLOAT                *PFLOAT;
typedef BOOL near            *PBOOL;
typedef BOOL far            *LPBOOL;
typedef BYTE near            *PBYTE;
typedef BYTE far            *LPBYTE;
typedef int near            *PINT;
typedef int far              *LPINT;

posted @ 2011-06-30 21:59 托雷宽 阅读(430) | 评论 (0)编辑 收藏

C++ 注册表操作总结
2008-01-11 20:45
1、RegCloseKey()
  原型:RegCloseKey(HKEY hKey)

  解释:关闭指定的注册表键,释放句柄。当对一个或多个键或值操作完成以后,需要关闭其键来进行保存操作结果,关闭一个键后,句柄变为非法,此时应释放句柄。
2、RegCreateKeyEx()
  原型:LONG RegCreateKeyEx( HKEY hKey, LPCTSTR lpSubKey, DWORD Reserved,
LPTSTR lpClass, DWORD dwOptions, REGSAM samDesired, LPSECURITY_ATTRIBUTES lpSecurityAttributes,
PHKEY phkResult, LPDWORD lpdwDisposition );

  解释:打开指定的键或子键。如果要打开的键不存在的话,本函数会试图建立它。提供该函数是为了向后兼容。所有的WIN32应用程序应使用函数RegCreateKeyEx()。 各参数及返回值的含义如下:

·hKey为主键值,可以取下面的一些数值:HKEY_CLASSES_ROOT、HKEY_CURRENT_CONFIG、   HKEY_CURRENT_USER、HKEY_LOCAL_MACHINE、HKEY_USER、 HKEY_PERFORMANCE_DATA(WINNT操作系统)、HKEY_DYN_DATA(WIN9X操作系统);
·参数lpSubKey为一个指向以零结尾的字符串的指针,其中包含将要创建或打开的子键的名称。子键不可以用反斜线(\)开始。该参数可以为NULL;

·参数Reserved为保留值,必须设置为0;

·参数lpClass为一个指向包含键类型的字符串。如果该键已经存在,则忽略该参数;

·参数dwOptions为新创建的键设置一定的属性。可以取下面的一些数值:  REG_OPTION_NON_VOLATILE ,表示新创建的键为一个非短暂性的键(数据信息保存在文件中,当系统重新启动时,数据信息恢复);REG_OPTION_VOLATILE,表示新创建的 键为一个短暂性的键(数据信息保存在内存中),Windows95忽略该数值;REG_OPTION_BACKUP_RESTORE 仅在WINNT中支持,可以提供优先级支持;

·参数dwOptions为新创建的键设置一定的属性。可以取下面的一些数值:  REG_OPTION_NON_VOLATILE ,表示新创建的键为一个非短暂性的键(数据信息保存在文件中,当系统重新启动时,数据信息恢复);REG_OPTION_VOLATILE,表示新创建的 键为一个短暂性的键(数据信息保存在内存中),Windows95忽略该数值;REG_OPTION_BACKUP_RESTORE 仅在WINNT中支持,可以提供优先级支持;

  ·参数samDesired用来设置对键访问的权限,可以取下面的一些数值:KEY_CREATE_LINK,表示准许生成符号 键;KEY_CREATE_SUB_KEY 表示准许生成子键;KEY_ENUMERATE_SUB_KEYS 表示准许生成枚举子键;KEY_EXECUTE 表示准许进行读操作;KEY_NOTIFY表示准许更换通告;  KEY_QUERY_VALUE 表示准许查询子键;KEY_ALL_ACCESS 提供完全访问,是上面数值的组合;

  KEY_READ 是下面数值的组合:KEY_QUERY_VALUE、KEY_ENUMERATE_SUB_KEYS、KEY_NOTIFY;   KEY_SET_VALUE 表示准许设置子键的数值;KEY_WRITE 是下面数值的组合:KEY_SET_VALUE、KEY_CREATE_SUB_KEY;
·参数lpSecurityAttributes为一个指向SECURITY_ATTRIBUTES结构的指针,确定返回的句柄是否被子处理过程继承。如果该参数为NULL,则句柄不可以被继承。在WINNT中,该参数可以为新创建的键增加安全的描述;

  ·参数phkResult为一个指向新创建或打开的键的句柄的指针;

  ·参数lpdwDispition指明键是被创建还是被打开的,可以是下面的一些数值:  REG_CREATE_NEW_KEY 表示键先前不存在,现在被创建;REG_OPENED_EXISTING_KEY 表示键先前已存在,现在被打开。

  如果该函数调用成功,则返回ERROR_SUCCESS。否则,返回值为文件WINERROR.h中定义的一个非零的错误代码,可以通过设置 FORMAT_MESSAGE_FROM_SYSTEM标识调用FormatMessage()函数来获取一个对错误的总体描述。
3、RegOpenKeyEx()
  原型:LONG RegOpenKeyEx(HKEY hKey, LPCTSTR lpSubKey, DWORD ulOptions,
REGSAM samDesired, PHKEY phkResult );

  解释:打开一个指定的键,并返回打开键的句柄。

各参数及返回值的含义如下:
·参数hKey的含义同RegCreateKeyEx函数中的hKey参数;

·参数lpSubKey为一个指向以零结尾的字符串的指针,其中包含子键的名称,可以利用反斜线(\)分隔不同的子键名。如果字符串为空,则根据hKey参数创建一个新的句柄。在这种情况下,并不关闭先前打开的句柄;
·参数ulOption保留,通常必须设置为0;

·参数samDesired的含义同RegCreateKeyEx函数中的samDesired参数;

·参数phkResult为一个指针,用来指向打开的键的句柄。可以通过RegCloseKey函数关闭这个句柄;

·函数的返回值同RegCreateKeyEx函数的返回值。
4、查询某一个键值:RegQueryValueEx()

  原型:LONG RegQueryValueEx(HKEY hKey, LPCTSTR lpValueName, LPDWORD pReserved, LPDWORD lpType,
LPBYTE lpData, LPDWORD lpcbData );

  解释:根据要查询的键的句柄,要返回的查询的数据。

  各个参数及返回值的含义如下:

  ·参数hKey为当前的一个打开的键的句柄,具体数值同RegCreateKeyEx函数的hKey参数;

  ·参数lpVauleName为一个指向非空的包含查询值的名称的字符串指针;

  ·参数lpReserved保留,必须为NULL;

  ·参数lpType为一个指向数据类型的指针,数据类型为下列类型之一:REG_BINARY 二进制数据、REG_DWORD 32位整数、REG_DWORD_LITTLE_ENDIAN little-endian格式的数据,例如0X12345678以(0X78 0X56 0X34 0X12)方式保存、REG_DWORD_BIG_ENDIAN big-endian格式的数据,例如0X12345678以(0X12 0X34 0X56 0X78)方式保存、REG_EXPAND_SZ 一个包含未扩展环境变量的字符串、REG_LINK 一个Unicode类型的链接、REG_MULIT_SZ 以两个零结尾的字符串、REG_NONE 无类型数值、REG_RESOURCE_LIST 设备驱动资源列表、REG_SZ 一个以零结尾的字符串根据函数使用的字符集类型的不同而设置为Unicode或ANSI类型的字符串;

  ·参数lpData为一个指向保存返回值的变量的指针。如果不需要返回值,该参数可以为NULL;

  ·参数lpcbData为一个指向保存返回值长度的变量的指针。其中长度以字节为单位。如果数据类型为REG_SZ、REG_MULTI_SZ或 REG_EXPAND_SZ,那么长度也包括结尾的零字符,只有在参数lpData为NULL时,参数lpcbData才可以为NULL;返回值同 RegCreateKeyEx函数的返回值;
 5、RegSetValueEx()

  原型:LONG RegSetValueEx(HKEY hKey, LPCTSTR lpValueName, LPDWORD lpReserved, DWORD dwType,
const BYTE *lpData, DWORD cbData);

  解释:设置注册表中的一个键值。

  各个参数及返回值的含义如下:

  ·参数hKey的含义同RegCreateKeyEx函数中的hKey参数;

  ·参数lpValueName为一个指向包含值名的字符串指针;Reserved保留,通常必须设置为0;

  ·参数dwType确定了设置的值的类型同RegQueryValueKeyEx的lyType参数;

  ·参数lpData为一个指向包含数据的缓冲区的指针;

  ·参数cbData以字节为单位,指定数据的长度;

  返回值同RegCreateKeyEx函数的返回值。
6、RegDeleteKey()

  原型:LONG RegDeleteKey(HKEY hKey,LPCTSTR lpSubKEY);

  解释:函数RegDeleteKey删除一个键及所有的子键。

  各个参数及返回值的含义如下:

  ·参数hKey的含义同RegCreateKeyEx函数中的hKey参数;

  ·参数lpSubKey的含义同RegCreateKeyEx函数中的lpSubKey参数。
转自:
lucky dog
http://hi.baidu.com/luosiyong/blog/item/585facef152a90ebcf1b3e5b.html

posted @ 2011-06-30 11:13 托雷宽 阅读(314) | 评论 (0)编辑 收藏

人们一般用     WM_USER   或     WM_USER+上某个值   表明“这是不是一个   WINDOWS   系统消息”
即自定义的消息的消息ID   一般取   WM_USER   +   x

在设计错误处理机制时将success考虑成error的一种状态,
ERROR_SUCCESS的定义为#define ERROR_SUCCESS 0L

关于异常的捕获:
在try块中进行异常的判断,如果出现异常就进行throw,然后再catch中进行处理:
example:
#include   <iostream>
#include   <fstream>

using namespace std;

int main()
{
    ifstream   ifile( "F:\stellarium-0.10.6.1exe ",ios::in|ios::binary);
    ofstream   ofile( "D:\\stellarium-0.10.6.1.exe ",ios::binary);
    try
    {
        if (ifile==NULL)
        {
            throw -1;
        }
        ofile<<(ifile.rdbuf());//流输入器,将streambuffer的地址给ofile
    }
    catch(int a)//对于throw抛出的特定类型进行捕获
    {
        cout<<"copy error"<<endl;
    }
    ifile.close();
    ofile.close();
    system("pause");
    return 0;
}

关于线程的创建
在MFC中使用AfxBeginThread函数来创建一个新的线程,
1:第一个参数应给一个全局函数的名字,不带括号,
2:如果是该对话框的内部成员函数应该是static类型的,在函数实现时不需要加static关键字,
3:在传参时使用类名::函数名的形式
4:创建的新线程在调用成员函数时只能调用静态成员函数和全局变量。

判断文件是否存在可以用CFileFind类,如果删除一个文件,可以用remove函数
    CFileFind finder;    CString strFileName = "D:\\test.txt";    BOOL bWorking = finder.FindFile(strFileName);    if (bWorking)    {       remove(strFileName);    }    finder.Close();

功 能: 把一整数转换为字符串
用 法: char *itoa(int value, char *string, int radix);
详细解释:itoa是英文integer to string a(将整形数转化为一个字符串,并将值保存在a中)
的缩写.其中value为要转化的整数, radix是基数的意思,即先将value转化为几进制的数,之后在保存在a 中.

    itoa()函数有3个参数:第一个参数是要转换的数字,第二个参数是要写入转换结果的目标字符串,第三个参数是转移数字时所用 的基数。在上例中,转换基数为10。10:十进制;2:二进制

posted @ 2011-06-30 08:48 托雷宽 阅读(224) | 评论 (0)编辑 收藏

C++对象模型系列:

本系列是主要是作者经验的总结且同时参考了大量的网络文章,希望能够给C++的学习者有所帮助,但是由于作者水平有限,难免有错,希望大家能够指出,我将虚心地向大家学习,与大家共同进步!本系列的开发环境是Windows 32+VS2008。

文章:

 指针和引用
 指针与数组
 指针与字符串
 堆栈与函数调用
 sizeof与对象内存布局
 单继承与虚函数表
 多重继承与虚函数表
 虚继承与虚函数表
 类型转化

参考:

1) C++对象模型
 C++对象模型笔记:http://blog.csdn.net/ZengMuAnSha/archive/2004/10/13/135477.aspx
 C++对象内存布局1:http://blog.csdn.net/haoel/archive/2008/10/15/3081328.aspx
 C++对象内存布局1:http://blog.csdn.net/haoel/archive/2008/10/15/3081385.aspx
 C++虚函数表解析: http://blog.csdn.net/haoel/archive/2007/12/18/1948051.aspx
 字节对齐1:http://blog.csdn.net/xuegao007/archive/2007/07/26/1708349.aspx
 字节对齐2:http://blog.csdn.net/xuegao007/archive/2007/07/26/1708355.aspx
 字节对齐3:http://blog.csdn.net/xuegao007/archive/2007/07/26/1708360.aspx
 sizeof : http://blog.csdn.net/xuegao007/archive/2007/08/23/1756047.aspx
 C++内存对象大会战1:http://blog.csdn.net/xuegao007/archive/2007/08/03/1723765.aspx
 C++内存对象大会战2:http://blog.csdn.net/xuegao007/archive/2007/08/03/1723766.aspx
 C++内存管理详解 : http://www.cnblogs.com/dazhong/articles/721704.html
 C++内存布局 :http://www.cnblogs.com/len3d/archive/2007/09/26/906899.html
 Visual C++ 8.0对象布局的奥秘:虚函数、多继承、虚拟继承 : http://www.cnblogs.com/neoragex2002/archive/2007/11/01/VC8_Object_Layout_Secret.html
 关于typeid和RTTI的问答  :http://blog.csdn.net/gxj1680/archive/2009/01/05/3715364.aspx
 字符串与数组工具收藏:http://tfzxbookshell.spaces.live.com/blog/cns!EB39D7FA27BCD1A1!902.entry
 memset ,memcpy 和strcpy 的根本区别?:http://tfzxbookshell.spaces.live.com/blog/cns!EB39D7FA27BCD1A1!904.entry
 函数调用约定和堆栈:http://www.fmddlmyy.cn/text12.html
 Win32程序函数调用时堆栈变化情况分析收藏:
http://www.cnblogs.com/hellohuan/archive/2008/07/07/1237371.html
http://blog.csdn.net/wenjie2005/archive/2008/01/09/2031377.aspx
C++ sizeof 使用规则及陷阱分析: http://freeman.cnblogs.com/articles/sizeof.html
What static_cast<> is actually doing:http://www.codeproject.com/KB/cpp/static_cast.aspx
Using generics in C++/CLI:http://www.codeproject.com/KB/mcpp/cppcligenerics.aspx
Type Casting:
http://www.cplusplus.com/doc/tutorial/typecasting.html
http://en.wikipedia.org/wiki/Typeid
type_info:
http://msdn.microsoft.com/zh-cn/library/70ky2y6k(en-us,VS.80).aspx
http://www.cplusplus.com/reference/std/typeinfo/type_info.html
http://www.informit.com/guides/content.aspx?g=cplusplus&seqNum=120
http://www.atnf.csiro.au/computing/software/sol2docs/manuals/c++/prog_guide/RTTI.html
http://www.linuxtopia.org/online_books/programming_books/c++_practical_programming/c++_practical_programming_208.html
http://en.wikibooks.org/wiki/C%2B%2B_Programming/RTTI
http://docs.hp.com/en/B3901-90024/ch06s05.html
各种cast:
http://www.codeproject.com/KB/mcpp/castingbasics.aspx
http://www.cplusplus.com/doc/tutorial/typecasting.html
http://blog.baisi.net/?441896/viewspace-4063
http://blog.csdn.net/singno116/archive/2008/04/18/2304962.aspx
http://blog.chinaunix.net/u2/70445/showart_1357610.html
http://read.newbooks.com.cn/info/50236.html

谢谢!

感谢,Thanks!

作者:iTech
出处:http://itech.cnblogs.com/
本文版权归作者iTech所有,转载请包含作者签名和出处,不得用于商业用途,非则追究法律责任!

posted @ 2011-06-18 09:30 托雷宽 阅读(248) | 评论 (0)编辑 收藏

WinPcap的使用说明网上也有不少,这里仅作学习过程的记录。
    首先,从官方下载了较新的开发包WpdPack_4_0_2,里面有不少的例子。不过都是VC6.0的,而我想要开发的环境是VS2008。
    WinPcap解压后有5个文件夹,其中Lib和Include两个要包含在工程中。方法如下:
      1)项目->属性->配置属性->链接器->常规->附加库目录,加入Lib所在路径;
      2)项目->属性->配置属性->链接器->输入->附加依赖项,加入wpcap.lib与Packet.lib两个静态链接库;
      3)项目->属性->配置属性->C/C++->常规->附加包含目录,加入Include所在路径。
    接着,我参考了http://www.smatrix.org/bbs/read.php?tid=358&fpage=4里头的步骤开始获取网络驱动。结果很不幸地出现了一些莫名其妙的错误:
      1>c:\program files\microsoft sdks\windows\v6.0a\include\netioapi.h(155) : error C2146: 语法错误 : 缺少“;”(在标识符“PhysicalMediumType”的前面)。
      错误发生在    NDIS_PHYSICAL_MEDIUM PhysicalMediumType 这一句上。网上有一些解析,说这是因为VS2008对ntddndis.h里头的定义比较新,WinPcap的头文件在对ntddndis.h的编译过后没有获得相应的定义,因此NDIS_PHYSICAL_MEDIUM不是一个结构或类,所以就产生了缺少“;”这样奇怪的错误。把netioapi.h里的#include <ntddndis.h>改为#include "ntddndis.h"后终于通过编译,改为" "后项目则从包括的文件中先查找头文件的定义,若找不到再从默认路径中查找。(网上查到的解析是:<>先去系统目录中找头文件,如果没有在到当前目录下找。而""首先在当前目录下寻找,如果找不到,再到系统目录中寻找。因此我猜想Include文件夹里头的ntddndis.h有NDIS_PHYSICAL_MEDIUM的定义。再查看了一下Include文件夹里的ntddndis.h,也没发现,但在查看c:\program files\microsoft sdks\windows\v6.0a\include\下的ntddndis.h时竟然发现有NDIS_PHYSICAL_MEDIUM的定义!!! 是不是我对系统目录的概念理解有误呢?假如把Include(WinPcap中)里的头文件删了,再改回<>可以通过编译的话,那么就说明在用<>的情况下查找的顺序应该是先查Include文件夹再查默认路径。一试之下竟然应验了。于是再去搜了一个尖括号与双引号的区别,这个解析得比较清晰:双引号时,系统先在引用被包含文件的源文件所在的文件目录中寻找要包含的文件,若找不到,再按系统指定的标准方式检索其他目录。尖括号时,不检查原文件所在的文件目录,而直接按系统标准方式检索文件目录这样子就能解析发生了什么问题,因为发生错误的是在netioapi.h的头文件里,而这个头文件是在c:\program files\microsoft sdks\windows\v6.0a\include\下,所以在用<>时项目没有直接查与netioapi.h同一目录下的ntddndis.h,而是直接查到了Include头上。

posted @ 2011-06-16 10:00 托雷宽 阅读(1370) | 评论 (1)编辑 收藏

1.首先创建一个Win32 Console Application的空工程!

2.点击创建的空工程的工程属性目录,到里面设置一些目录。

具体如下:

    (1)点击C/C++目录,在右边的Preprocessor Definition加上WPCAP和HAVE_REMOTE每项之间用";"隔开

    (2)点击C/C++目录,点击展开的目录General,在右侧的Additional Include Directories中添加Include目录(Include目录在WpdPack中)

    (3)点击Linker目录,点击展开的目录General,在右边的Additional Library Directories中添加lib目录(Include目录在WpdPack中)

    (4)点击Linker目录下的Input,在右侧的Additional Dependencies中添加wpcap.lib和ws2_32.lib

以上就是Winpcap在VS2008中的环境配置

下面给出一个简单的例子.完全参照WinPap中文技术文档


  1. #include<stdio.h>  
  2. #include"pcap.h"  
  3. void main()  
  4. {  
  5.     pcap_if_t *alldevs;  
  6.     pcap_if_t *d;  
  7.     int i=0;  
  8.     char errbuf[PCAP_ERRBUF_SIZE];  
  9.     if(pcap_findalldevs_ex(PCAP_SRC_IF_STRING,NULL,&alldevs,errbuf)==-1)  
  10.     {  
  11.         fprintf(stderr,"Error in pcap_findalldevs_ex:%s\n",errbuf);  
  12.         exit(1);  
  13.     }  
  14.     for(d = alldevs;d!=NULL;d = d->next)  
  15.     {  
  16.         printf("%d.  %s",++i,d->name);  
  17.         if(d->description)  
  18.             printf("(%s)\n",d->description);  
  19.         else  
  20.             printf("(No description availble)\n");  
  21.     }  
  22.     if(i==0)  
  23.     {  
  24.         printf("\nNo interface found! Make sure WinPcap is installed.\n");  
  25.         return;  
  26.     }  
  27.     pcap_freealldevs(alldevs);  
  28. }  
 

获取适配器列表,并在屏幕上显示出来,如果没有找到适配器,将打印错误信息。

posted @ 2011-06-16 09:08 托雷宽 阅读(913) | 评论 (0)编辑 收藏

仅列出标题
共3页: 1 2 3