BOOL GetVolumeInformation(    LPCTSTR lpRootPathName, // address of root directory of the file system 
    LPTSTR lpVolumeNameBuffer, // address of name of the volume 
    DWORD nVolumeNameSize, // length of lpVolumeNameBuffer 
    LPDWORD lpVolumeSerialNumber, // address of volume serial number 
    LPDWORD lpMaximumComponentLength, // address of system's maximum filename length
    LPDWORD lpFileSystemFlags, // address of file system flags 
    LPTSTR lpFileSystemNameBuffer, // address of name of file system 
    DWORD nFileSystemNameSize  // length of lpFileSystemNameBuffer 
   );
调用的api函数如上所示。
但是在具体的调用中:
Function TForm1.GetDiskSerialNumber: String;
Var
  VolumeSerialNumber: DWORD;
  MaximumComponentLength: DWORD;
  FileSystemFlags: DWORD;
  SerialNumber: String;
Begin
  GetVolumeInformation('C:\',
    Nil,
    0,
    @VolumeSerialNumber,//请注意这一行
    MaximumComponentLength,//请注意这一行
    FileSystemFlags,//请注意这一行
    Nil,
    0);
  SerialNumber := IntToHex(HiWord(VolumeSerialNumber), 4) +
    '-' +
    IntToHex(LoWord(VolumeSerialNumber), 4);
  Result := SerialNumber;
End;
为什么api中都是LPDWORD 指针型,而调用的时候只有@VolumeSerialNumber为指针型,而MaximumComponentLength和FileSystemFlags不用指针!莫名其妙!

解决方案 »

  1.   

    function GetVolumeInformation(
      lpRootPathName: PChar;
      lpVolumeNameBuffer: PChar; 
      nVolumeNameSize: DWORD; 
      lpVolumeSerialNumber: PDWORD;
      var lpMaximumComponentLength, lpFileSystemFlags: DWORD;
      lpFileSystemNameBuffer: PChar; 
      nFileSystemNameSize: DWORD): BOOL; stdcall;
      

  2.   

    to:saxash(还在想)   你说的api怎么和我的不一样呀?我在MSDN及delphi的SDK中都是
    BOOL GetVolumeInformation(    LPCTSTR lpRootPathName, // address of root directory of the file system 
        LPTSTR lpVolumeNameBuffer, // address of name of the volume 
        DWORD nVolumeNameSize, // length of lpVolumeNameBuffer 
        LPDWORD lpVolumeSerialNumber, // address of volume serial number 
        LPDWORD lpMaximumComponentLength, // address of system's maximumfilenamelength
        LPDWORD lpFileSystemFlags, // address of file system flags 
        LPTSTR lpFileSystemNameBuffer, // address of name of file system 
        DWORD nFileSystemNameSize  // length of lpFileSystemNameBuffer 
       );这样呀???为什么就改成var lpMaximumComponentLength, lpFileSystemFlags: DWORD;
    please tell me whythanks!!
      

  3.   

    我写的API函数接口是Delphi 封装后的,你可以在Windows 单元中找到它。
    这个接口与调用相一致吧。很多API函数Delphi 都重新封装过了。
      

  4.   

    谢谢saxash(还在想) 的回答!
    终于明白这个问题了!
    看来以后调用sdk要注意这一点!
    delphi也太不够意思!自己重新封装!
    就应该在做一个帮助文档呀!
    简直那人开涮!鄙视它!