Вернуться   CoderX :: Forums > Основные форумы > Программинг
Войти через OpenID

Программинг Форум для тем связанных с программированием

Чат (Новых сообщений с момента вашего последнего визита нет)
Загрузка...
Задавайте ваши вопросы на форуме. Чат предназначен для небольших разговоров.
 
Ответ
 
Опции темы Опции просмотра
Старый 18.09.2010, 22:59   #1
Пользователь
 
Аватар для ALF
 
Регистрация: 18.09.2010
Адрес: Киев
Сообщений: 70
Сказал Спасибо: 9
Имеет 10 спасибок в 6 сообщенях
ALF пока неопределено
Восклицание Вывод текста в окно игры

Помогите вывести текст в игру.
Вот мой код, но он не работает.
Буду очень благодарен за помощь.
delphi Код:
library MyFirstDLL; uses   SysUtils,   Classes,   Graphics,   Forms,   Windows; const adres = '?DrawString@FCanvasUtil@@QAEHHHPBGPAVUFont@@VFColor@@@Z'; type TBOB = procedure(x,y:Integer; text, font:PChar; color:TColor); stdcall; procedure HelloWorld(); var         DLLInstance : THandle;         BOB: TBOB; begin         { загружаем DLL }         DLLInstance := LoadLibrary('Engine.dll');    @BOB := GetProcAddress(DLLInstance, adres);    BOB(100,100,'SSSSSSSSSSS','Font1',$00FFFFFF);     FreeLibrary(DLLInstance); end; {Какой-нибудь код, в котором используется SomeBuffer.} exports         HelloWorld; begin end.

Последний раз редактировалось xkor, 19.09.2010 в 15:32.
ALF вне форума   Ответить с цитированием
Старый 18.09.2010, 23:55   #2
Рыцарь
 
Аватар для Morfik
 
Регистрация: 13.10.2009
Сообщений: 665
Сказал Спасибо: 38
Имеет 172 спасибок в 108 сообщенях
Morfik пока неопределено
По умолчанию

DrawString есть методом класса FCanvasUtil
для его вызова нужно или найти указатель на уже готовый объект класса FCanvasUtil или создать свой (как работает клиент в этом отношении точно не скажу)

во 2-м случаем можно найти экспортируемый конструктор для FCanvasUtil и создать его. Далее при вызове после передачи параметров методу в ecx нужно вставить адресс обьекта класса FCanvasUtil (это проблема перехода из thiscall)
Код:
@BOB := GetProcAddress(DLLInstance, adres);
asm
   push 0ffffffh
   ...
   push 100
   mov ecx,PFCanvasUtil
   call [BOB]
end;
//BOB(100,100,'SSSSSSSSSSS','Font1',$00FFFFFF);
где PFCanvasUtil и будет указателем на обьект класса FCanvasUtil

Последний раз редактировалось Morfik, 18.09.2010 в 23:58.
Morfik вне форума   Ответить с цитированием
За это сообщение Morfik нажился спасибкой от:
Старый 19.09.2010, 00:29   #3
Пользователь
 
Аватар для ALF
 
Регистрация: 18.09.2010
Адрес: Киев
Сообщений: 70
Сказал Спасибо: 9
Имеет 10 спасибок в 6 сообщенях
ALF пока неопределено
По умолчанию

я полазил на форуме, и наткнулся на
PHP код:
function foo(obj:TObj arg1:T1arg2:T2);stdcall;
asm
  pop eax 
//адрес возврата, временно сохраняем в eax
  
pop ecx //аргумент obj, записываем в ecx как того требует __thiscall
  
push eax //записываем сохраненный адрес возврата
 
jmp [foo//вызываем метод    
end

Последний раз редактировалось ALF, 19.09.2010 в 00:32. Причина: Добавлено сообщение
ALF вне форума   Ответить с цитированием
Старый 22.09.2010, 18:11   #4
Местный
 
Регистрация: 10.08.2010
Сообщений: 634
Сказал Спасибо: 22
Имеет 95 спасибок в 70 сообщенях
mira пока неопределено
По умолчанию

первый метод который описал морфик проще. Хукаеш любой метод этого обьекта сохраняеш содержимое есх. И пользуеш его в своих методах если отсуствие синхронизации не повлечёт проблем.
Я вообще хукаю endscene на уровне директх и рисую че хочу
mira вне форума   Ответить с цитированием
За это сообщение mira нажился спасибкой от:
Старый 25.09.2010, 15:25   #5
Пользователь
 
Аватар для ALF
 
Регистрация: 18.09.2010
Адрес: Киев
Сообщений: 70
Сказал Спасибо: 9
Имеет 10 спасибок в 6 сообщенях
ALF пока неопределено
По умолчанию

Цитата:
Сообщение от Morfik Посмотреть сообщение
DrawString есть методом класса FCanvasUtil
для его вызова нужно или найти указатель на уже готовый объект класса FCanvasUtil или создать свой (как работает клиент в этом отношении точно не скажу)

во 2-м случаем можно найти экспортируемый конструктор для FCanvasUtil и создать его. Далее при вызове после передачи параметров методу в ecx нужно вставить адресс обьекта класса FCanvasUtil (это проблема перехода из thiscall)
Код:
@BOB := GetProcAddress(DLLInstance, adres);
asm
   push 0ffffffh
   ...
   push 100
   mov ecx,PFCanvasUtil
   call [BOB]
end;
//BOB(100,100,'SSSSSSSSSSS','Font1',$00FFFFFF);
где PFCanvasUtil и будет указателем на обьект класса FCanvasUtil
а можно чуть по подробнее о конструкторе и что должно быть там где три точки у Вас в кода...
И если не сложно можете объяснить эту методику?

На сколько я понял мы кидаем в стек 0ffffff
потом три точки О_о (хз что там за код должен быть)
потом в стек по идеи число 100 но зачем О_о?
а регистр есх помещаем адрес памяти к функциии..
Короче что-то я туплю... О_о
Можно описать по подробнее...?

Последний раз редактировалось ALF, 25.09.2010 в 15:30.
ALF вне форума   Ответить с цитированием
Старый 26.09.2010, 02:06   #6
Рыцарь
 
Аватар для Morfik
 
Регистрация: 13.10.2009
Сообщений: 665
Сказал Спасибо: 38
Имеет 172 спасибок в 108 сообщенях
Morfik пока неопределено
По умолчанию

пример вызова функции BOB(100,100,'SSSSSSSSSSS','Font1',$00FFFFFF);
на ассемблеровском вызове будет иметь вид
delphi Код:
var     text,font:string; begin     text:='SSSSSSSSS';     font:='Font1';     ptext:=pchar(text);     pfont:=pchat(font);     asm         push 0FFFFFFh         push pfont         push text         push 100         push 100         call [BOB]     end; end;

тоесть параметры функции засовуються в стек, в обратном порядке.

+еще перед вызовом засунуть в ecx указатель на обьект класа канваса, который луче всего получить перехватив один из его методов (курим тему хуков)

зы:вообщем луче создайка отдельное винапи окошко и выводи инфу туда - гемору будет меньше

Последний раз редактировалось Morfik, 26.09.2010 в 02:44.
Morfik вне форума   Ответить с цитированием
Старый 27.09.2010, 22:52   #7
Пользователь
 
Аватар для ALF
 
Регистрация: 18.09.2010
Адрес: Киев
Сообщений: 70
Сказал Спасибо: 9
Имеет 10 спасибок в 6 сообщенях
ALF пока неопределено
По умолчанию

и так у меня код сейчас выглядит так
PHP код:
library MyFirstDLL;
uses
  SysUtils
,
  
Classes,
  
Graphics,
  
Forms,
  
Windows;
const
adres '?DrawString@FCanvasUtil@@QAEHHHPBGPAVUFont@@VFColor@@@Z';
type
TBOB 
procedure(x,y:Integertextfont:PCharcolor:TColor); stdcall;


procedure HelloWorld();
var
        
DLLInstance THandle;
        
BOBTBOB;
        
font,text:string;
begin
        
загружаем DLL }
        
DLLInstance := LoadLibrary('Engine.dll');
   @
BOB := GetProcAddress(DLLInstanceadres);
font:=PChar('Font1')'
text:=PChar('
ssssssssss');
       asm
        push 0FFFFFFh
        push font
        push text
        push 100h
        push 100h
mov ecx, адрес фунции??? какой...?
        call [BOB]
    end;

    FreeLibrary(DLLInstance);


end;

{Какой-нибудь код, в котором используется SomeBuffer.}

exports
        HelloWorld;
begin
end. 
Цитата:
указатель на обьект класа канваса, который луче всего получить перехватив один из его методов (курим тему хуков)
вот тут я и не понял...
Нам надо указать адрес функции
PHP код:
?DrawString@FCanvasUtil@@QAEHHHPBGPAVUFont@@VFColor@@@
или чего? О_о
У меня есть полностью от "Декомпилированый" engine.dll прогой IDA pro (думаю знаете). но все равно туплю)
в пушом параметров - понял)))
но в регистр ecx - хз О_о
Пробовал без него - клиент запустился, на екране пусто)

Добавлено через 21 час 47 минут
потупил я потупил и пришла в голову мысль в еах засунуть адрес
PHP код:
FCanvasUtil::~FCanvasUtil 
Только какой именно? тот что получают методом GetProcAddress? или туда надо оригинальный RVA?

Последний раз редактировалось ALF, 27.09.2010 в 22:52. Причина: Добавлено сообщение
ALF вне форума   Ответить с цитированием
Старый 28.09.2010, 02:00   #8
Рыцарь
 
Аватар для Morfik
 
Регистрация: 13.10.2009
Сообщений: 665
Сказал Спасибо: 38
Имеет 172 спасибок в 108 сообщенях
Morfik пока неопределено
По умолчанию

в ecx нам надо указать не адрес функции (вообще твоя функция DrawString это метод класса FCanvasUtil - ты знаеш что такое классы и наф они нужны? ) а адресс обьекта класса

Вообщем рекомендую тебе забить на это... и использовать как mira рисование в endscene DirectX
http://tracker2k.kiev.ua/5.html
Morfik вне форума   Ответить с цитированием
За это сообщение Morfik нажился 2 спасибками от:
Старый 28.09.2010, 12:16   #9
Пользователь
 
Аватар для ALF
 
Регистрация: 18.09.2010
Адрес: Киев
Сообщений: 70
Сказал Спасибо: 9
Имеет 10 спасибок в 6 сообщенях
ALF пока неопределено
По умолчанию

СПАСИИИИБООО!!!!!!!
ALF вне форума   Ответить с цитированием
Старый 28.09.2010, 17:57   #10
Местный
 
Регистрация: 10.08.2010
Сообщений: 634
Сказал Спасибо: 22
Имеет 95 спасибок в 70 сообщенях
mira пока неопределено
По умолчанию

возможности на уровне ДХ куда больше но на столькаже больше и делов =)

Последний раз редактировалось mira, 01.12.2010 в 19:28.
mira вне форума   Ответить с цитированием
За это сообщение mira нажился спасибкой от:
Ответ

  CoderX :: Forums > Основные форумы > Программинг



Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Часовой пояс GMT +4, время: 01:25.

vBulletin style designed by MSC Team.
Powered by vBulletin® Version 3.6.11
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Locations of visitors to this page
Rambler's Top100

Вы хотите чувствовать себя в безопасности? чоп Белган обеспечит её!