procedure TForm1.Button1Click(Sender: TObject);
var
ptr : PChar;
iptr : PChar;
dwSize : integer;
str : string;
i, types : Integer;
begin
dwsize := GetLogicalDriveStrings(0, Nil);
//위 문장을 실행하면 dwsize에 전체 logical drive를 나열한 스트링의
//총 길이가 나옵니다.
GetMem(ptr, dwsize);
//PChar 변수인 ptr에 메모리를 할당합니다.
GetLogicalDriveStrings(dwsize, ptr);
//할당된 메모리에 logical drive의 스트링을 가져옵니다.
//정확한 건 아니지만 제 생각으로는 넘어오는 스트링의 형식은 다음과 같습니다.
// 'a: c: d: w: '
//드라이명 뒤에 붙는 는 NULL character..
iptr := ptr;
while (StrLen(iptr) <> 0) do
begin
Listbox1.Items.Add(iptr);
iptr := iptr + strlen(iptr) + 1;
end;
//위의 루프가 널 문자로 분리된 각 logical drive의 이름을 추출합니다.
for i := 0 to listbox1.Items.Count - 1 do
begin
types := GetDriveType(PChar(listbox1.Items[i]));
str := listBox1.items[i] + ' ' + IntToStr(types);
listbox2.Items.add(str);
end;
//각각의 drive 이름을 주고 type을 알아냅니다.
FreeMem(ptr, dwsize);
//메모리를 해제
end;
위의 소스에서 ptr, iptr 이 pchar인데 pchar의 개념과
소스에서의 ptr, iptr은 번지인지 아니면 번지값인지 잘 모르겠습니다.
출력되는 값은 문자열인데 iptr := iptr + strlen(iptr) + 1에서는
연산을 합니다.
그리고 ^P와 p^의 차이점도 궁금하네요.
> procedure TForm1.Button1Click(Sender: TObject);
> var
> ptr : PChar;
> iptr : PChar;
> dwSize : integer;
> str : string;
> i, types : Integer;
> begin
> dwsize := GetLogicalDriveStrings(0, Nil);
> //위 문장을 실행하면 dwsize에 전체 logical drive를 나열한 스트링의
> //총 길이가 나옵니다.
>
> GetMem(ptr, dwsize);
> //PChar 변수인 ptr에 메모리를 할당합니다.
> GetLogicalDriveStrings(dwsize, ptr);
>
> //할당된 메모리에 logical drive의 스트링을 가져옵니다.
> //정확한 건 아니지만 제 생각으로는 넘어오는 스트링의 형식은 다음과 같습니다.
> // 'a: c: d: w: '
> //드라이명 뒤에 붙는