Chinaunix首页 | 论坛 | 博客
  • 博客访问: 415986
  • 博文数量: 152
  • 博客积分: 1885
  • 博客等级: 上尉
  • 技术积分: 1306
  • 用 户 组: 普通用户
  • 注册时间: 2007-07-13 16:51
文章分类

全部博文(152)

文章存档

2013年(1)

2012年(17)

2011年(19)

2010年(109)

2009年(6)

我的朋友

分类: 数据库开发技术

2011-01-11 22:55:44

读取硬盘序列号  

  要读取硬盘序列号我们可以用汇编来实现,但毕竟不容易,况且也不能有效的结合到PB脚本中。在PB中我们可以通过调用Windows提供的外部函数
GetVolumeInformationA()来实现。这相对来说比较简单。  

  该函数的原型为:  

  BOOL   GetVolumeInformation(  

  LPCTSTR   lpRootPathName,  

  LPTSTR   lpVolumeNameBuffer,  

  DWORD   nVolumeNameSize,  

  LPDWORD   lpVolumeSerialNumber,  

  LPDWORD   lpMaximumComponentLength,  

  LPDWORD   lpFileSystemFlags,  

  LPTSTR   lpFileSystemNameBuffer,  

  DWORD   nFileSystemNameSize  

  上述原型中,参数类型只要是以 "LP- "开头的表明该参数用的是长指针(Long   Pointer)类型,即在PB中调用时的参数传递是通过引用传递。在8
个参数中对我们真正有用的只有两个LPCTSTR   lpRootPathName和LPDWORD   lpVolumeSerialNumber。其中参数lpRootPathName是指向文件系统根目录的
地址,我们需要用它来指明所要获取序列号的硬盘盘符;参数lpVolumeSerialNumber是返回的硬盘序列号的地址,这正是我们需要的。  

  众所周知,PB在调用任何外部函数前都要首先进行函数声明,可以将声明放在全局或局部函数声明中。具体声明如下:  

  Function   Boolean   GetVolumeInformationA(   &  

  ref   String   ls_Rootpath,   &  

  ref   String   ls_volumnename,   &  

  Ulong   lul_VolumeNameSize,   ref   Ulong   lul_VolumeSerialNumber,   &  

  ref   Ulong   lul_MaximumComponentLength,   &  

  ref   Ulong   lul_FileSystemFlags,   &  

  ref   String   ls_FileSystemNameBuffer,   &  

  Ulong   lul_FileSystemNameSize   &  

  )   Library   "Kernel32.dll "  

 

  上述声明中, "ref "指明是该参数是通过引用传递的,有关函数引用的详细内容请参见有关教程。声明完毕我们不能马上进行调用,还必需确保已
为它分配足够的内存空间,即使是参数引用传递也是这样,否则的话将会出现调用错误,这跟C语言的引用调用不同,这一点往往被忽视,希望读者能
够注意。也就是为什么我在调用该函数前将有些字符串参数给它预先分配了多达256个字符空间以及给一些整型类型的参数赋初始值256。完整的读取
硬盘序列号的程序代码如下:  

/*******************   程序代码   ************************/  

String   ls_Rootpath,   ls_volumnename  

ls_Rootpath   =   "C: "   //   指定要得到序列号的硬盘,  

//   一般情况都是C盘,除非你能保证用户存在其它逻辑盘或物理盘  

ls_volumnename   =   Space(256)   //   分配足够的空间,下同  

Ulong   lul_VolumeNameSize  

lul_VolumeNameSize   =   256  

Ulong   lul_VolumeSerialNumber,   lul_MaximumComponentLength,   lul_FileSystemFlags  

lul_MaximumComponentLength   =   256  

String   ls_FileSystemNameBuffer  

ls_FileSystemNameBuffer   =   space(256)  

Ulong   lul_FileSystemNameSize  

lul_FileSystemNameSize   =   256  

beep(1)  

boolean   lb_rtn  

lb_rtn   =   False  

lb_rtn   =   GetVolumeInformationA(ls_Rootpath,   ls_volumnename,   lul_VolumeNameSize,  

lul_VolumeSerialNumber,   lul_MaximumComponentLength,   lul_FileSystemFlags,  

ls_FileSystemNameBuffer,   lul_FileSystemNameSize)  

if   lb_rtn   =   true   then  

MessageBox( "提示 ", "函数调用成功! ")  

else  

MessageBox( "提示 ", "函数调用失败! ")  

end   if  

sle_1.text   =   String(lul_VolumeSerialNumber)   //   得到硬盘序列号  

/*********************   结束   *************************/  
阅读(2564) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2011-03-09 10:10:59

很好的, 收藏了 推荐一个博客,提供很多免费软件编程电子书下载: http://free-ebooks.appspot.com