Текущий архив: 2007.10.14;
Скачать: CL | DM;
Вниз
Указатель на виртуальную функцию. Помогите. Найти похожие ветки
← →
DevilDevil © (2007-08-02 11:08) [0]Задача на самом деле шире...
Однако постепенно убирая из своего кода лишнее пришёл к следующему:
[code]
type
TClass1 = class
procedure AnotherVirtual; virtual;
procedure SomeFunc; virtual;
end;
procedure TClass1.AnotherVirtual;
begin end;
procedure TClass1.SomeFunc;
begin
ShowMessage("это функция TClass1");
end;
function GetProc(CLS : TClass; ProcOffs : integer) : pointer;
var
I : integer;
begin
Result := ppointer(integer(pointer(CLS)^) + ProcOffs)^;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
ProcOffs : integer;
P1, P2 : pointer;
begin
asm
mov ProcOffs, VMTOFFSET TClass1.SomeFunc
end;
P1 := @TClass1.SomeFunc;
P2 := GetProc(TClass1, ProcOffs);
{asm
call P2
end; }
Caption := IntToStr(Integer(P1)) + " " + IntToStr(Integer(P2));
end;
[/code]
В чём собственно ошибка?
- По идее, P1 должен быть равен P2, а не равен!
Причём ProcOffs всегда вычисляется корректно, - сейчас 4; если в объявлении, функции поменять местами, то 0.
Предположение одно: ошибка в функции [code]GetProc()[/code]. Как ни старался, всё приводило к AccesViolation.
Заранее спасибо.
← →
DevilDevil © (2007-08-02 11:10) [1]хммм...
1) извинюсь, теги не обработались
2) текуший GetProc - это очередной тест. "Рабочая" функция выглядит так:function GetProc(CLS : TClass; ProcOffs : integer) : pointer;
begin
Result := pointer(integer(pointer(CLS)^) + ProcOffs);
end;
← →
DevilDevil © (2007-08-02 12:23) [2]извиняюсь, не туда написал
← →
DevilDevil © (2007-08-02 18:52) [3]эээ . на вопрос уже получен ответ:
http://delphimaster.net/view/1-1186043128/
Страницы: 1 вся ветка
Текущий архив: 2007.10.14;
Скачать: CL | DM;
Память: 0.46 MB
Время: 0.029 c