Q&A

  • 하드 정보 알아내기??
안녕하세요 꾸벅~!

procedure TForm1.Button1Click(Sender: TObject);

var

VolumeName,

FileSystemName : array [0..MAX_PATH-1] of Char;

VolumeSerialNo : DWord;

MaxComponentLength,

FileSystemFlags : Integer;

begin

GetVolumeInformation('C:',VolumeName,MAX_PATH,@VolumeSerialNo,

MaxComponentLength,FileSystemFlags,

FileSystemName,MAX_PATH);

Memo1.Lines.Add('VName = '+VolumeName);

Memo1.Lines.Add('SerialNo = $'+IntToHex(VolumeSerialNo,8));

Memo1.Lines.Add('CompLen = '+IntToStr(MaxComponentLength));

Memo1.Lines.Add('Flags = $'+IntToHex(FileSystemFlags,4));

Memo1.Lines.Add('FSName = '+FileSystemName);

end;

밑에 어떤분께서 올리신거 실습 해봤는데 GetVolumeInformation에서

[Error] Unit1.pas(36): Types of actual and formal var parameters must be identical 이런 에러가 생기네요 왜그럴까? ㅡ.ㅡ;; 36라인은 GetVolumeInformation라인 바로 다음 라인입니다. 답변 부탁드립니다.

2  COMMENTS
  • Profile
    whitetree 2001.03.17 02:41
    송수현 wrote:

    > 안녕하세요 꾸벅~!

    > procedure TForm1.Button1Click(Sender: TObject);

    > var

    > VolumeName,

    > FileSystemName : array [0..MAX_PATH-1] of Char;

    > VolumeSerialNo : DWord;

    > MaxComponentLength,

    > FileSystemFlags : Integer;

    > begin

    > GetVolumeInformation('C:',VolumeName,MAX_PATH,@VolumeSerialNo,

    > MaxComponentLength,FileSystemFlags,

    > FileSystemName,MAX_PATH);

    > Memo1.Lines.Add('VName = '+VolumeName);

    > Memo1.Lines.Add('SerialNo = $'+IntToHex(VolumeSerialNo,8));

    > Memo1.Lines.Add('CompLen = '+IntToStr(MaxComponentLength));

    > Memo1.Lines.Add('Flags = $'+IntToHex(FileSystemFlags,4));

    > Memo1.Lines.Add('FSName = '+FileSystemName);

    > end;

    > 밑에 어떤분께서 올리신거 실습 해봤는데 GetVolumeInformation에서

    > [Error] Unit1.pas(36): Types of actual and formal var parameters must be identical 이런 에러가 생기네요 왜그럴까? ㅡ.ㅡ;; 36라인은 GetVolumeInformation라인 바로 다음 라인입니다. 답변 부탁드립니다.



    ================================================================

    MaxComponentLength, FileSystemFlags 변수의 데이터형을 Integer형인 아닌 DWord형으로....수정하시면. 됩니다.





    var

    VolumeName,

    FileSystemName : array [0..MAX_PATH-1] of Char;

    VolumeSerialNo : DWord;

    MaxComponentLength,

    FileSystemFlags : Integer; <--- DWord;



    이부분에서....



    MaxComponentLength,

    FileSystemFlags : Integer; 을 integer형이 아닌 DWord형으로 수정해 주시면 됩니다.



    --->



    procedure TForm1.Button1Click(Sender: TObject);

    var

    VolumeName,

    FileSystemName : array [0..MAX_PATH-1] of Char;

    VolumeSerialNo : DWord;

    MaxComponentLength,

    FileSystemFlags : DWord;

    begin

    GetVolumeInformation('C:',VolumeName,MAX_PATH,@VolumeSerialNo,

    MaxComponentLength,FileSystemFlags,

    FileSystemName,MAX_PATH);

    Memo1.Lines.Add('VName = '+VolumeName);

    Memo1.Lines.Add('SerialNo = $'+IntToHex(VolumeSerialNo,8));

    Memo1.Lines.Add('CompLen = '+IntToStr(MaxComponentLength));

    Memo1.Lines.Add('Flags = $'+IntToHex(FileSystemFlags,4));

    Memo1.Lines.Add('FSName = '+FileSystemName);

    end;















  • Profile
    이현우 2000.02.16 04:42
    송수현 wrote:

    > 안녕하세요 꾸벅~!

    > procedure TForm1.Button1Click(Sender: TObject);

    > var

    > VolumeName,

    > FileSystemName : array [0..MAX_PATH-1] of Char;

    > VolumeSerialNo : DWord;

    > MaxComponentLength,

    > FileSystemFlags : Integer;

    > begin

    > GetVolumeInformation('C:',VolumeName,MAX_PATH,@VolumeSerialNo,

    > MaxComponentLength,FileSystemFlags,

    > FileSystemName,MAX_PATH);

    > Memo1.Lines.Add('VName = '+VolumeName);

    > Memo1.Lines.Add('SerialNo = $'+IntToHex(VolumeSerialNo,8));

    > Memo1.Lines.Add('CompLen = '+IntToStr(MaxComponentLength));

    > Memo1.Lines.Add('Flags = $'+IntToHex(FileSystemFlags,4));

    > Memo1.Lines.Add('FSName = '+FileSystemName);

    > end;

    > 밑에 어떤분께서 올리신거 실습 해봤는데 GetVolumeInformation에서

    > [Error] Unit1.pas(36): Types of actual and formal var parameters must be identical 이런 에러가 생기네요 왜그럴까? ㅡ.ㅡ;; 36라인은 GetVolumeInformation라인 바로 다음 라인입니다. 답변 부탁드립니다.





    "Types of actual and formal var parameters must be identical" 이라는 에러는

    프로시져의 var 파라미터가 들어가야 할 곳에 제대로 값이 들어가지 않아서

    그런거지요(^^; 뭐, 저도 자세히는 몰라서..쩝)

    예를 들자면, 스트링그리드의



    procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol,

    ARow: Integer; var CanSelect: Boolean)의 CanSelect처럼



    다른 프로시져에서 호출할 때 그냥 StringGrid1SelectCell(Sender,1,1,TRUE)라고

    부르면 이런 에러 메세지가 뜹니다. 이때 바로그 위에서

    var Bool : Boolean;

    : :

    Bool := TRUE;

    StringGrid1SelectCell(Sender,1,1,BOOL);

    이라고 해주면 에러가 나지 않지요.. 그러니까, var 파라미터가 있는 매개변수의 경우

    넘겨 줘야할 값의 저장장소를 할당해 줘서 넘겨줘야 한다는 말이겠지요..

    뭐 저도 대충 짐작으로 이정도 이해하고 있습니다. 제가 잘못 알고 있다면

    다른 분이 지적해 주시면 감사하겠습니다.



    그리고 어디선가 다른 분이 만드신 함수를 퍼다가 놓았습니다.

    참조하십시오..



    function ExtGetVolumeInfo(DrvName : string):String;

    var

    lpRootPathName : PChar;

    lpVolumeNameBuffer : PChar;

    nVolumeNameSize : DWORD;

    lpVolumeSerialNumber : DWORD;

    lpMaximumComponentLength : DWORD;

    lpFileSystemFlags : DWORD;

    lpFileSystemNameBuffer : PChar;

    nFileSystemNameSize : DWORD;

    VolumeName : string;

    begin

    try

    GetMem( lpVolumeNameBuffer, MAX_PATH + 1 );

    GetMem( lpFileSystemNameBuffer, MAX_PATH + 1 );



    nVolumeNameSize := MAX_PATH + 1;

    nFileSystemNameSize := MAX_PATH + 1;



    lpRootPathName := PChar(DrvName);

    if Windows.GetVolumeInformation( lpRootPathName,

    lpVolumeNameBuffer,

    nVolumeNameSize,

    @lpVolumeSerialNumber,

    lpMaximumComponentLength,

    lpFileSystemFlags,

    lpFileSystemNameBuffer,

    nFileSystemNameSize ) then

    Result := lpVolumeNameBuffer

    else Result := '';

    finally

    FreeMem( lpVolumeNameBuffer );

    FreeMem( lpFileSystemNameBuffer );

    end;

    end;