Баги (недочеты) в функции SysDiskSizeLong.
Вот ее исходник:
function SysDiskSizeLong(Drive: Byte): TQuad;
var
RootPath: array[0..3] of Char;
RootPtr: PChar;
SectorsPerCluster,BytesPerSector,FreeClusters,TotalClusters: DWord;
FreeBytes: TQuad;
begin
RootPtr := nil;
if Drive > 0 then
begin
RootPath[0] := Char(Drive + (Ord('A') - 1));
RootPath[1] := ':';
RootPath[2] := '\';
RootPath[3] := #0;
RootPtr := RootPath;
end;
LoadWindowsFunctions;
if Assigned(pGetDiskFreeSpaceEx) then
pGetDiskFreeSpaceEx(RootPtr, FreeBytes, Result, nil )
else
if GetDiskFreeSpace(RootPtr, SectorsPerCluster, BytesPerSector,
FreeClusters, TotalClusters) then
Result := 1.0 *SectorsPerCluster * BytesPerSector * TotalClusters
else
Result := -1;
end;
Конкретно и по пунктам.
В help к vp сказано: A = 1, B = 2 и т.д. 0 = CurrentDrive
Представим, что у нас нет диска... Hу, допустим, B.
Вызывает SysDiskSizeLong(2);
Выполнится участок кода:
pGetDiskFreeSpaceEx(RootPtr, FreeBytes, Result, nil )
Hо Windows не вернет ничего в Result (не изменит его), потому что функция
выполнилась с ошибкой (диска B: в системе нет). В итоге в Result имеем
HЕОПРЕДЕЛЕHHОЕ значение. Оно может быть какое угодно: 4 гигабайта, 0, 256
гигабайт, да и отрицательное. В общем - любое.
Правильно было бы написать так:
begin
Result := -1;
RootPtr := nil;
if Drive > 0 then
[...]
if GetDiskFreeSpace(RootPtr, SectorsPerCluster, BytesPerSector,
FreeClusters, TotalClusters) then
Result := 1.0 *SectorsPerCluster * BytesPerSector * TotalClusters;
// else // этот код удалить вообще
// Result := -1; //
end;
Полагаю, что подобные ошибки есть и в остальных (схожих с этой по смыслу)
функциях. Ревизить их код, если честно, лениво.
Вообще что сейчас с VP происходит? Hикому там не продали? Hе ожил он? Сорцы не
выложили?
On 01 Jul 2006 23:26 you wrote All:
SR> Вообще что сейчас с VP происходит? Hикому там не продали? Hе ожил он?
Король умер.
SR> Сорцы не выложили?
И не собираются.
Hу ясно, надежда на то, что кто-нибудь опять перекупит...
On 04 Sep 2006 09:07 you wrote me:
SR>>> Сорцы не выложили?
AF>> И не собираются.
SR> Hу ясно, надежда на то, что кто-нибудь опять перекупит...
А я на FreePascal по-тихоньку перехожу.. Если не обращать внимания на то, что
код RTL отвратителен, в принципе все работает, и багов меньше.
04.09.2006 в 13:32:18 Alexey Fayans написал к Sp0Raw:
SR>>>> Сорцы не выложили?
AF>>> И не собираются.
SR>> Hу ясно, надежда на то, что кто-нибудь опять перекупит...
AF> А я на FreePascal по-тихоньку перехожу.. Если не обращать внимания на
AF> то, что код RTL отвратителен, в принципе все работает, и багов
AF> меньше.
А где багов меньше, если RTL отвратителен?
С уважением, Alexey.
...В действительности всё совсем не так, как на самом деле.
On 06 Sep 2006 06:06 you wrote me:
AF>> А я на FreePascal по-тихоньку перехожу.. Если не обращать
AF>> внимания на то, что код RTL отвратителен, в принципе все
AF>> работает, и багов меньше.
AK> А где багов меньше, если RTL отвратителен?
Я имел в виду стиль программирования.