现在有这样一个问题,我的程序需要读取硬盘的序列号,在网上看到很多关于如何用DiskID32.dll来获取硬盘序列号的文章,也尝试着去使用,发现无法获取序列号,程序没有任何错误,但是在获取序列号的时候返回的硬盘序列号始终是0,返回值也是0,在网上没有发现这样的问题,查阅大量文章后都不能解决我的问题。
不能使用WMI,因为这个在某些机器上没有安装,并且有的机器可能损坏,也有可能这个服务用户没有开启。
具体代码如下:        [DllImport("DiskID32.dll")]
        public static extern long DiskID32(ref byte DiskModel, ref byte DiskID);        public static string GetDiskID()
        {
            byte[] DiskModel = new byte[31];
            byte[] DiskID = new byte[31];
            int i;
            string Model = "";
            string ID = "";            if (DiskID32(ref DiskModel[0], ref DiskID[0]) != 1)
            {                for (i = 0; i < 31; i++)
                {                    if (Convert.ToChar(DiskID[i]) != Convert.ToChar(0))
                    {
                        ID = ID + Convert.ToChar(DiskID[i]);
                    }
                }
                ID = ID.Trim();
            }
            else
            {
                Console.WriteLine("获取硬盘序列号出错");
            }
            return ID;
        }
在这个方法中,DiskModel和DiskID中的所有元素全是0,DiskID32方法的返回值也是0.
我的环境是:
操作系统:Win7
开发环境:VS2010, VS2008
机器类型:64位机,32位机
这些测试都不能通过,请大家帮忙看看问题所在,多谢了!!!

解决方案 »

  1.   

    据说这东西对新的SATA硬盘支持不好。很老的dll了。
      

  2.   

    可是我在网上找到一个DiskID32.exe,就可以读取出我的硬盘的ID来
    网址:http://www.winsim.com/diskid32/diskid32.html
    我想如果那个exe可以用,那么这个DLL应该可以用吧:)
      

  3.   

    解决步骤:
    1、Win7上面,先用VC测试DiskID32.dl,能否正常使用。
    2、如果1通过,你把DiskID32函数C++原型贴出来,代码加上try{}catch{},进行断点调试,看看报什么错误
      

  4.   

    我的操作系统是win7X64的。sql server 2008&&VS 2010的。我跟你的情况一样,你把要执行的程序编译为.exe文件后,只要以管理员身份运行就能取到值了,但是需要注意的是,BS程序在IIS7下部署时会有问题。所以请注意。还有就是取到的值不是完整的串号,而是标识。想得到串号只能用WMI,另外dll文件很容易被替换,所以想用它得到硬盘号加密是没有意义的,三思吧。老弟。