Арифметика указателя в D2007, как мне заставить его работать? - PullRequest
3 голосов
/ 10 декабря 2011

При компиляции Embarcadero VirtualShellTools в Delphi 2007: http://embtvstools.svn.sourceforge.net/

function TShellIDList.InternalChildPIDL(Index: integer): PItemIDList;
{ Remember PIDLCount does not count index [0] where the Absolute Parent is     }
begin
  if Assigned(FCIDA) and (Index > -1) and (Index < PIDLCount) then
    Result := PItemIDList( PByte(FCIDA) 
                         + PDWORD(PByte(@FCIDA^.aoffset)
                                  +sizeof(FCIDA^.aoffset[0])*(1+Index))^)
  else
    Result := nil
end;

Я получаю эту ошибку:

[Pascal Error] IDEVirtualDataObject.pas (1023): E2015 Оператор не применим к этому типу операнда

В чем проблема с этим кодом и какой тип приведения типов мне нужно сделать, чтобы он действительно работал?

Я получаюта же ошибка в следующей (менее сложной) подпрограмме:

function TShellIDList.InternalParentPIDL: PItemIDList;
{ Remember PIDLCount does not count index [0] where the Absolute Parent is     }
begin
  if Assigned(FCIDA) then
      Result :=  PItemIDList( PByte(FCIDA) + FCIDA^.aoffset[0])
  else
    Result := nil
end;

Ответы [ 2 ]

6 голосов
/ 10 декабря 2011

Pointermath был представлен в Delphi 2009. Лучшее, что вы можете сделать в Delphi 2007, - это использовать Inc процедуру вместо:

function TShellIDList.InternalChildPIDL(Index: integer): PItemIDList;
{ Remember PIDLCount does not count index [0] where the Absolute Parent is     }
var
  Tmp, Tmp2: PByte;

begin
  if Assigned(FCIDA) and (Index > -1) and (Index < PIDLCount) then begin
    Tmp2:= PByte(@FCIDA^.aoffset);
    Inc(Tmp2, sizeof(FCIDA^.aoffset[0])*(1+Index));
    Tmp:= PByte(FCIDA);
    Inc(Tmp, PDWORD(Tmp2)^);
    Result := PItemIDList(Tmp);
  end
  else
    Result := nil
end;
3 голосов
/ 10 декабря 2011

Вы также можете заменить PByte на PAnsiChar.

...