明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1462|回复: 15

[讨论] 关于获取硬盘信息的一些疑问。

[复制链接]
发表于 2022-9-14 15:53:10 | 显示全部楼层 |阅读模式
本帖最后由 ou67169488 于 2022-9-14 16:04 编辑
  1. (DEFUN PHYHAR (/ RET SERX OBJW LCCON LOX)

  2.   (VL-LOAD-COM)

  3.   (SETQ SERX '())

  4.   (IF (SETQ OBJW (VLAX-CREATE-OBJECT "wbemScripting.SwbemLocator"))

  5.     (PROGN

  6.       (SETQ LCCON (VLAX-INVOKE OBJW 'CONNECTSERVER "." "\\root\\cimv2" "" ""

  7.              "" "" 128 NIL

  8.       )

  9.       )

  10.       (SETQ LOX (VLAX-INVOKE LCCON 'EXECQUERY "Select SerialNumber,Tag from Win32_PhysicalMedia"))

  11.       (VLAX-FOR ITEM LOX (if (= (VLAX-GET ITEM 'TAG) "\\\\.\\PHYSICALDRIVE0")

  12.          (setq SERX (VLAX-GET ITEM 'SERIALNUMBER))

  13.        )

  14.       )


  15.       (VLAX-RELEASE-OBJECT LOX)

  16.       (VLAX-RELEASE-OBJECT LCCON)

  17.       (VLAX-RELEASE-OBJECT OBJW)

  18.     )

  19.   )

  20.   (PRINC)

  21. )
上面提取本机硬盘信息,但是在多硬盘的情况下PHYSICALDRIVE0可能会变化,比如昨天PHYSICALDRIVE0是硬盘1,第二天就变成了硬盘2,怎么样做才能保证我们获取到的是主系统盘呢?

发表于 2022-9-19 14:33:29 | 显示全部楼层

这几天忙,一直惦记着还有这个事情,我整理了一下代码,估计这个应该就是你想要的结果了

  1. (setq a (vlax-create-object "wbemscripting.swbemlocator") b (vlax-invoke a 'connectserver))
  2. (setq c (vlax-invoke b 'execquery "select * from win32_diskpartition"))
  3. (vlax-for e c (if (/= (vlax-get e "bootable") 0) (setq d (vlax-get e "diskindex"))))
  4. (setq f (vlax-invoke b 'execquery "select * from win32_diskdrive"))
  5. (vlax-for e f (if (= (vlax-get e "index") d) (setq g (vlax-get e "serialnumber"))))
  6. (princ g)
发表于 2022-9-14 16:59:45 | 显示全部楼层
ou67169488 发表于 2022-9-14 16:44
是的,我知道这是个集合,但是顺序会变化。怎么去判断哪个是主硬盘呢?

我刚查了一下

Windows识别的磁盘编号取决于磁盘初始化完成的时间点。如果磁盘初始化所需要的时间不一样,那么初始化完成快的硬盘编号就低。而磁盘编号这个属性并不是保存在Windows系统中,所以有可能每次启动都会变。微软说了这个变化不影响系统的运行。

按照这个说法,单用你这个判断"\\\\.\\PHYSICALDRIVE0"的方法是行不通了
发表于 2022-9-14 17:33:56 | 显示全部楼层
本帖最后由 自贡黄明儒 于 2022-9-15 17:06 编辑
ou67169488 发表于 2022-9-14 16:46
这个获取的信息比我的全面一点,不过硬盘顺序是一样的,还是会变化。

再看这个(syz-read-disk-boot-sector "C:")
(syz-read-disk-boot-sector "C:")
[url]http://bbs.mjtd.com/thread-184656-1-1.html?_dsign=427ed74f
[/url]

;;[功能]盘符序列号
(tranf 'FIND_SERIALNUMBER);;==>T
(FIND_SERIALNUMBER "c:")
(FIND_SERIALNUMBER "D:\\")

发表于 2022-9-14 16:00:03 | 显示全部楼层
 楼主| 发表于 2022-9-14 16:02:08 | 显示全部楼层
自贡黄明儒 发表于 2022-9-14 16:00
这里,可以参考一下
http://bbs.mjtd.com/thread-185781-1-1.html?_dsign=103eb83a

谢谢大佬的答疑,不过我这个问题主要是诱惑硬盘的主硬盘信息会变化,想找到解决方案。
发表于 2022-9-14 16:12:15 | 显示全部楼层
ou67169488 发表于 2022-9-14 16:02
谢谢大佬的答疑,不过我这个问题主要是诱惑硬盘的主硬盘信息会变化,想找到解决方案。

不知道是哪个 写的。你可以参考一下

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
发表于 2022-9-14 16:31:55 | 显示全部楼层
这里主要的问题是,你的程序中定义的LOX在多硬盘的时候其实得到的是个类似“集合”,相当于多硬盘的信息都在LOX中,需要用类似(setq d (cons x d))的方法分解出来,然后在判断哪个是主硬盘,最后再得到主硬盘的信息
 楼主| 发表于 2022-9-14 16:44:50 | 显示全部楼层
caaooo 发表于 2022-9-14 16:31
这里主要的问题是,你的程序中定义的LOX在多硬盘的时候其实得到的是个类似“集合”,相当于多硬盘的信息都 ...

是的,我知道这是个集合,但是顺序会变化。怎么去判断哪个是主硬盘呢?
 楼主| 发表于 2022-9-14 16:46:40 | 显示全部楼层
自贡黄明儒 发表于 2022-9-14 16:12
不知道是哪个 写的。你可以参考一下

这个获取的信息比我的全面一点,不过硬盘顺序是一样的,还是会变化。
发表于 2022-9-14 18:34:50 | 显示全部楼层
既然顺序能变,那就不用顺序。把所有的都读出来,判断想要的东西是否在里面
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-16 00:37 , Processed in 0.175427 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表