Полезное для программистов:

Фриланс
Новости
Статьи
   
Рубрики:


Как преобразовать указатель на метод в указатель на функцию?

Поиск:
Код

// Converting method pointers into function pointers  

// Often you need a function pointer for a callback function. But what, if you want to specify a method as  
// an callback? Converting a method pointer to a function pointer is not a trivial task; both types are  
// incomatible with each other. Although you have the possibility to convert like this "@TClass.SomeMethod",  
// this is more a hack than a solution, because it restricts the use of this method to some kind of a class  
// function, where you cannot access instance variables. If you fail to do so, you'll get a wonderful gpf.  
// But there is a better solution: run time code generation! Just allocate an executeable memory block, and  
// write 4 machine code instructions into it: 2 instructions loads the two pointers of the method pointer  
// (code & data) into the registers, one calls the method via the code pointer, and the last is just a return  
// Now you can use this pointer to the allocated memory as a plain funtion pointer, but in fact you are  
// calling a method for a specific instance of a Class.  



type TMyMethod = procedure of object;  


function MakeProcInstance(M: TMethod): Pointer;  
begin  
 // allocate memory  
 GetMem(Result, 15);  
 asm  
   // MOV ECX,  
   MOV BYTE PTR [EAX], $B9  
   MOV ECX, M.Data  
   MOV DWORD PTR [EAX+$1], ECX  
   // POP EDX  
   MOV BYTE PTR [EAX+$5], $5A  
   // PUSH ECX  
   MOV BYTE PTR [EAX+$6], $51  
   // PUSH EDX  
   MOV BYTE PTR [EAX+$7], $52  
   // MOV ECX,  
   MOV BYTE PTR [EAX+$8], $B9  
   MOV ECX, M.Code  
   MOV DWORD PTR [EAX+$9], ECX  
   // JMP ECX  
   MOV BYTE PTR [EAX+$D], $FF  
   MOV BYTE PTR [EAX+$E], $E1  
 end;  
end;  


procedure FreeProcInstance(ProcInstance: Pointer);  
begin  
 // free memory  
 FreeMem(ProcInstance, 15);  
end;  






Просмотров: 2353

 

 

Новые статьи:


Популярные:
  1. Как сделать цикличным проигрывание MIDI-файла?
  2. Создание AVI файла из рисунков
  3. Как устройство "отключить в данной конфигурации"?
  4. Kто в данный момент присоединен через Сеть?
  5. Как узнать количество доступной памяти?
  6. Как реализовать в RichEdit разноцветный текст?
  7. Как скрыть свое приложение от ProcessViewer
  8. Как программно нажать/скрыть/показ кнопку "Start"?
  9. Модуль работы с ресурсами в PE файлах
10. Функции вызова диалоговых окон выбора
11. Проверка граматики средствами Word'а из Delphi.
12. Модуль для упрощенного вызова сообщений
13. Функции для записи и чтение своих данных в, ЕХЕ- файле
14. Рекурсивный просмотр директорий
15. Network Traffic Monitor
16. Разные модули
17. Универсальная функция для обращения к любым экспортируем функциям DLL
18. Библиотека от VladS
19. Протектор для UPX'а
20. Еще об ICQ, сообщения по контакт листу?
21. Использование открытых интерфейсов
22. Теория и практика использования RTTI
23. Работа с TApplication
24. Примеры использования Drag and Drop для различных визуальных компонентов
25. Что такое порт? Правила для работы с портами
26. Симфония на клавиатуре
27. Загрузка DLL
28. Исправление автоинкремента
29. Взаимодействие с чужими окнами
30. Проверить дубляжи в столбце


 

 

 
 
На главную