0

なので。どうでも。while/repeat ループの継続についての直感が間違っていました。自分を馬鹿にしました:-)

コメント行を参照してください。コメントを外すと、コンパイルはうまくいきます。コメントしたままにすると、未定義の結果について警告が表示されます。コンパイラは、Break and Continue のような疑似手続きを考慮していないようです。

Delphi の以前のバージョンで発生していますか? QCはありますか?

//returns 0 or win32 error code
function TfmMain.callQDN(DeviceName: string;
  out buff: string): DWORD;
const len_step = 8192;
var res, len, err: DWORD;
    lpDeviceName: PChar;
begin
  SetLength(buff, len_step);
  len := Length(buff);

  lpDeviceName := nil;
  if DeviceName>'' then lpDeviceName := @DeviceName[1];

  repeat
    Res := QueryDosDevice(lpDeviceName, @buff[1], len);

    if Res = 0 then begin
       err := GetLastError;
//       Result := err;

       if err = ERROR_INSUFFICIENT_BUFFER then begin
          len := len_step + len;
          SetLength(buff, len);
          continue;
       end;

       Result := err;
    end else begin
       Result := 0;
       SetLength(buff, res); // res+1 ?
    end;

  until (Result = 0);

end;
4

1 に答える 1

0

私は愚かだ。

ループ本体を再び開始するだけでなく、条件を再チェックし続ける

于 2012-07-25T10:59:08.480 に答える