Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.47 MB
Время: 0.02 c
15-1189512044
Layner
2007-09-11 16:00
2007.10.14
Серийный номер БИОСа/CPU в MS Viste?


1-1186047147
hgd
2007-08-02 13:32
2007.10.14
WebBrowser и прокси


15-1189775301
Dumb
2007-09-14 17:08
2007.10.14
Как создать интерфейс для Базы данных?


6-1171376436
X-Nex
2007-02-13 17:20
2007.10.14
WebBrowser конец загрузки страницы


2-1189763330
artem779
2007-09-14 13:48
2007.10.14
как изменить имя проекта ?