回 帖 发 新 帖 刷新版面

主题:有谁知道用Intel fortran调用api读取硬盘序列号的方法?赐教一下!万分感谢!

有谁知道用Intel fortran调用api读取硬盘序列号的方法?赐教一下!万分感谢!

回复列表 (共4个回复)

沙发

 理论上GetVolumeInformation函数是可以的但是我试了一下,可以得到卷名和文件系统,但得不到硬盘序列号。

program test
  use kernel32
  integer(BOOL) :: iRes ! BOOL
  character(5):: lpRootPathName="c:\" ! LPCSTR lpRootPathName
  character(12):: lpVolumeNameBuffer ! LPSTR lpVolumeNameBuffer
  integer(DWORD):: nVolumeNameSize=12 ! DWORD nVolumeNameSize
  integer(LPDWORD):: lpVolumeSerialNumber=0 ! LPDWORD lpVolumeSerialNumber
  integer(LPDWORD):: lpMaximumComponentLength=0 ! LPDWORD lpMaximumComponentLength
  integer(LPDWORD):: lpFileSystemFlags=0 ! LPDWORD lpFileSystemFlags
  character(10):: lpFileSystemNameBuffer ! LPSTR lpFileSystemNameBuffer
  integer(DWORD):: nFileSystemNameSize=10 ! DWORD nFileSystemNameSize

ires = GetVolumeInformation( &
        lpRootPathName, &
        lpVolumeNameBuffer, &
        nVolumeNameSize, &
        lpVolumeSerialNumber, &
        lpMaximumComponentLength, &
        lpFileSystemFlags, &
        lpFileSystemNameBuffer, &
        nFileSystemNameSize)
print*,iRes
print*,       lpRootPathName, &
        lpVolumeNameBuffer, &
        lpVolumeSerialNumber, &
        lpMaximumComponentLength, &
        lpFileSystemFlags, &
        lpFileSystemNameBuffer

pause
end program

板凳

① 就是,楼上这个用法我也试过了,就是读不出序列号。


② 我想问的是,楼上对调用GetVolumeInformation时在fortran中定义相关参数熟悉和理解吗?

我对你上面的那几个整型使用loc()调用,结果返回Res=1,调用也成功了,但每次读出来的序列号都不一样,我想读出来的就是一堆乱码,无意义。有谁能进来解释解释关于调用带参数的win32API函数时,在fortran里如何设置参数的问题?


③ 在fortran中调用含有type类型的win32 API函数,目前我已实现,就剩下这个问题了,像GetVolumeInformation这样含整型和字符相关参数的调用,不知道如何在Fortran中设置参数定义了?


④ 另外,有谁还在使用cvf的编译器?是否清楚 % bc 能否运行。这个是我在一个文献资料中看到的,说是对Fortran实参的取址操作。但是,这个根本在Intel Fortran中运行不了,所以,后来查资料,发现有人提出用loc()来替代这个符号的功能,但是如②,出来的序列号是乱码。


⑤ 大家一起来讨论讨论哈。。。。

3 楼

第二个问题,可以查看 ivf对kernel32的接口界面,在include文件夹 kernel32.f90 这个文件中。

4 楼

查看过,就是按那样定义的,依然读不出序列号

我来回复

您尚未登录,请登录后再回复。点此登录或注册