PDA

Просмотр полной версии : Вывод текста в окно игры


ALF
18.09.2010, 22:59
Помогите вывести текст в игру.
Вот мой код, но он не работает.
Буду очень благодарен за помощь.
library MyFirstDLL;
uses
SysUtils,
Classes,
Graphics,
Forms,
Windows;
const
adres = '?DrawString@FCanvasUtil@@QAEHHHPBGPAVUFont@@VFCol or@@@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.

Morfik
18.09.2010, 23:55
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

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

mira
22.09.2010, 18:11
первый метод который описал морфик проще. Хукаеш любой метод этого обьекта сохраняеш содержимое есх. И пользуеш его в своих методах если отсуствие синхронизации не повлечёт проблем.
Я вообще хукаю endscene на уровне директх и рисую че хочу

ALF
25.09.2010, 15:25
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 но зачем О_о?
а регистр есх помещаем адрес памяти к функциии..
Короче что-то я туплю... О_о
Можно описать по подробнее...?

Morfik
26.09.2010, 02:06
пример вызова функции BOB(100,100,'SSSSSSSSSSS','Font1',$00FFFFFF);
на ассемблеровском вызове будет иметь вид
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 указатель на обьект класа канваса, который луче всего получить перехватив один из его методов (курим тему хуков)

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

ALF
27.09.2010, 22:52
и так у меня код сейчас выглядит так
library MyFirstDLL;
uses
SysUtils,
Classes,
Graphics,
Forms,
Windows;
const
adres = '?DrawString@FCanvasUtil@@QAEHHHPBGPAVUFont@@VFCol or@@@Z';
type
TBOB = procedure(x,y:Integer; text, font:PChar; color:TColor); stdcall;


procedure HelloWorld();
var
DLLInstance : THandle;
BOB: TBOB;
font,text:string;
begin
{ загружаем DLL }
DLLInstance := LoadLibrary('Engine.dll');
@BOB := GetProcAddress(DLLInstance, adres);
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.
указатель на обьект класа канваса, который луче всего получить перехватив один из его методов (курим тему хуков)
вот тут я и не понял...
Нам надо указать адрес функции
?DrawString@FCanvasUtil@@QAEHHHPBGPAVUFont@@VFColo r@@@Z или чего? О_о
У меня есть полностью от "Декомпилированый" engine.dll прогой IDA pro (думаю знаете). но все равно туплю)
в пушом параметров - понял)))
но в регистр ecx - хз О_о
Пробовал без него - клиент запустился, на екране пусто)

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

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

Вообщем рекомендую тебе забить на это... и использовать как mira рисование в endscene DirectX
http://tracker2k.kiev.ua/5.html

ALF
28.09.2010, 12:16
СПАСИИИИБООО!!!!!!!

mira
28.09.2010, 17:57
возможности на уровне ДХ куда больше но на столькаже больше и делов =)

Morfik
28.09.2010, 20:01
возможности на уровне ДХ куда больше но на столькаже больше и делов =)

можно у тя как нить выпросить исходники хотябы класов контролов :) хотя бы кнопочки?)

ALF
28.09.2010, 21:49
Ребят а по этой теме не поможите ?)
а именно с
Точки можно рисовать короткими штрихами, окружности аппроксимировать отрезками (или пунктиром).
Рисовать надо вместе с клиентом, в одном из методов xxx::Render(), так чтобы картинка радара рисовалась последней (верхней), порядок вызова методов клиентом неизвестен, но рисование после FPlayerSceneNode::Render() позволяет нарисовать радар правильно.

mira
28.09.2010, 22:05
можно у тя как нить выпросить исходники хотябы класов контролов :) хотя бы кнопочки?)

нету там классов) в рукопашку все сделано
классы только для рисования на текстуре окна линий, битблита и текста
на подобии как на HDC

J-Fobos
28.09.2010, 22:10
mira, ваша прога распространяется? а то скрины вижу и слюнки текут =)

mira
29.09.2010, 00:39
mira, ваша прога распространяется? а то скрины вижу и слюнки текут =)

дак она под 1 сервер сделана для узково круга
зацеплена к клиенту через исправление таблицы импорта в d3ddrive.dll
инжекта нет некакова, раз нет апдейтера проверяющего файлы зачем было заморачиватса..

хотя на кое каких фришках мб и будет работать незнаю, или сделайте инжектор для нее)))

вживую можете глянуть у каво анлим) евс и маг живые http://files.mail.ru/TDPMBC

Morfik
29.09.2010, 01:08
нету там классов) в рукопашку все сделано
классы только для рисования на текстуре окна линий, битблита и текста
на подобии как на HDC

да я пока даже не вдупляю как сделать что то вроде простого прямоугольника который бы еще и реагировал на onmouseclick, весь этот ДХ для меня как китайская грамота :(

Ребят а по этой теме не поможите ?)
а именно с
рисуй в endscenecallback как по ссылке, там где g_font.DrawText вызываеться, это по сути тоже самое что цитируеш ты

ALF
29.09.2010, 20:15
да я пока даже не вдупляю как сделать что то вроде простого прямоугольника который бы еще и реагировал на onmouseclick, весь этот ДХ для меня как китайская грамота :(


рисуй в endscenecallback как по ссылке, там где g_font.DrawText вызываеться, это по сути тоже самое что цитируеш ты
Этот скрин...
Ото все Вы рисовали через ту ссылку что мне дали, или перехватом FCanvasUtil?

Добавлено через 1 час 48 минут
Ой я чет наделал
Терь клиент критует...
General protection fault!

History: FCanvasUtil::DrawString <- ViewportLock1 <- Precaching <- UGameEngine::Draw <- UWindowsViewport::Repaint <- UWindowsClient::Tick <- ClientTick <- UGameEngine::Tick <- UpdateWorld <- MainLoop

ALF
02.10.2010, 01:15
Вот исходник. Помогите плиз уже доделать его...

Morfik
02.10.2010, 13:25
во те рабочий ДХ пример


library dxtext;

uses
SysUtils,
Classes,
Windows,
Direct3D9,
D3DX9;

type
PDWORD=^DWORD;


var
D3DObj: IDirect3D9;
D3DDev: IDirect3DDevice9;

g_Font: ID3DXFont;

adr_Direct3DCreate9:DWORD;
adr_CreateDevice9:DWORD;
adr_EndScene9:DWORD;

function HookCode(target:pointer;new_adr,TrueAdr:PDWORD):BO OL;
var
op:DWORD;
begin
result:=false;
if ((VirtualProtect(target,5,PAGE_EXECUTE_READWRITE,@ op)) and (DWORD(target)>0)) then
begin
BYTE(target^):=$E9;
DWORD(Pointer(DWORD(target)+1)^):=DWORD(new_adr) - DWORD(target) - DWORD(5);
TrueAdr^:=DWORD(target)+5;
result:=true;
end;
end;

function GetInterfaceMethod(const intf; methodIndex: dword) : pointer;
begin
result := pointer(pointer(dword(pointer(intf)^) + methodIndex * 4)^);
end;


function EndScene9Next(self: pointer): HResult;stdcall;
begin asm jmp [adr_EndScene9] end; end;

function CreateDevice9Next(self: Pointer; Adapter: LongWord; DeviceType: TD3DDevType; hFocusWindow: HWND; BehaviorFlags: DWord; pPresentationParameters: PD3DPresentParameters; out ppReturnedDeviceInterface: IDirect3DDevice9) : HRESULT;stdcall;
begin asm jmp [adr_CreateDevice9] end; end;

function Direct3DCreate9Next(SDKVersion: LongWord): DWORD;stdcall;
begin asm jmp [adr_Direct3DCreate9] end; end;


//РИСУЕМ ТУТ
function EndScene9Callback(self: pointer): HResult; stdcall;
var
TextRect: TRect;
begin
//мы все еще между begin и endscene, знач рисуем
TextRect := Rect(100,100,100,100);
g_Font.DrawTextA(nil,PChar('Хеллоу ворлд!!!'),-1,@TextRect,DT_LEFT or DT_NOCLIP,D3DCOLOR_RGBA($ff, $00, $00, $ff));

//а вот теперь вызоверем оригинальную endscene
Result:=EndScene9Next(self);
end;
//конец того где рисуем


function CreateDevice9Callback(self: pointer; Adapter: LongWord; DeviceType: TD3DDevType; hFocusWindow: HWND; BehaviorFlags: DWord; pPresentationParameters: PD3DPresentParameters; out ppReturnedDeviceInterface: IDirect3DDevice9) : HRESULT; stdcall;
var
A: Integer;
begin
result := CreateDevice9Next(self, adapter, DeviceType, hFocusWindow, BehaviorFlags, pPresentationParameters, ppReturnedDeviceInterface);
D3DDev := ppReturnedDeviceInterface;
if (result = 0) then
begin
A := D3DXCreateFont(
D3DDev, 14, 0, FW_NORMAL, 1,
false, DEFAULT_CHARSET,
OUT_DEFAULT_PRECIS,
DEFAULT_QUALITY,
DEFAULT_PITCH or FF_DONTCARE,
PChar('Arial'),
g_Font
);

HookCode(GetInterfaceMethod(ppReturnedDeviceInterf ace{^}, 42), @EndScene9Callback, @adr_EndScene9);
end;
end;

function Direct3DCreate9Callback(SDKVersion: LongWord): DWORD; stdcall;
var
F: TStrings;
begin
Result:=Direct3DCreate9Next(SDKVersion);
D3DObj := IDirect3D9(Result);
if (Result <> 0) then
begin
HookCode(GetInterfaceMethod(result, 16), @CreateDevice9Callback, @adr_CreateDevice9);
end;
end;

begin
HookCode(GetProcAddress(LoadLibraryA('d3d9.dll'),' Direct3DCreate9'), @Direct3DCreate9Callback, @adr_Direct3DCreate9)
end.

ALF
02.10.2010, 15:12
Спасибо. Откомпилировалось нормально. Появилсь ДЛЛ-ка. Но что с ней делать то? О_о

Morfik
02.10.2010, 16:29
Спасибо. Откомпилировалось нормально. Появилсь ДЛЛ-ка. Но что с ней делать то? О_о

инжектит в игру) причем до инициализации ДХ интерфеса, тоесть сразу при запуске

ALF
02.10.2010, 23:56
инжектит в игру) причем до инициализации ДХ интерфеса, тоесть сразу при запуске
Приведи плиз пример кода инжекта)
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
Timer1: TTimer;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

uses Direct3D9, madCodeHook;

procedure TForm1.Button1Click(Sender: TObject);
var
start: TStartupInfo;
procInfo: TProcessInformation;

begin
ZeroMemory(@start, SizeOf(start));
start.cb:=SizeOf(Start);
if CreateProcessA('C:\Games\LineAge\system\l2.exe',
'', nil, nil, True, CREATE_SUSPENDED, nil,
'C:\Games\LineAge\system', start, procInfo) then
begin
if not InjectLibraryA(procInfo.hProcess, 'my_lib.dll') then
ShowMessage('failed');
ResumeThread(procInfo.hThread);
end;
end;

end.


а то этим не получается ><

Добавлено через 5 часов 1 минуту
Терь проблема другая)
Инжект вроде получился (с помощью кода, указанного выше)
НО на экране ниче не увидел)

mira
03.10.2010, 00:53
Спасибо. Откомпилировалось нормально. Появилсь ДЛЛ-ка. Но что с ней делать то? О_о

если я все прально понимаю ее нужно просто подгрузить приложением =)
кстате директ-х хеадеры этиже пользую, но хукаю чуток не так

ALF
03.10.2010, 11:37
Мож исход скинуть как ты подгружаешь )

mira
03.10.2010, 18:59
Мож исход скинуть как ты подгружаешь )

а никак я вообще в d3ddrv.dll поменял в таблице импортa
d3d9.dll на свою iohp.dll пока нет никакова чекера файлов на серве не буду морочитса с инжектом

ALF
03.10.2010, 20:05
О_о что за "iohp.dll"?

mira
04.10.2010, 01:12
О_о что за "iohp.dll"?

враппер для d3d9.dll (гуглю в помощ) а по совместительству ядро самой программы

ЗЫ п
римитивный скрипт для фарма СОД for mamba

ALF
04.10.2010, 01:15
library MyFirstDLL;
uses
SysUtils,
Classes,
Graphics,
Forms,
Windows;
const
adres = '?DrawString@FCanvasUtil@@QAEHHHPBGPAVUFont@@VFCol or@@@Z';
adres1 = '??1FCanvasUtil@@UAE@XZ';
adres2 = '?Render@FPlayerSceneNode@@UAEXPAVFRenderInterface @@@Z';
text ='ALF';

procedure HelloWorld();
var
DLLInstance : THandle;
FCanvasUtilAddr,BOB: PByte;
font:string;
x,y:integer;
begin
{ загружаем DLL }
DLLInstance := LoadLibrary('Engine.dll');
BOB := GetProcAddress(DLLInstance, adres);
FCanvasUtilAddr := GetProcAddress(DLLInstance, adres1);
font :='Engine.DefaultFont'; {ХЗ КАКОЙ ШРИФТ ЮЗАЕТ ЛИНЕЙКА}
x:=200;
y:=200;
asm
push 00FF0000h {цвет}
push dword [font]{Шрифт, В ФОРМАТЕ UFont - я хз как}
push word [text] {Текст}
push y {у}
push x {х}
mov ecx, FCanvasUtilAddr
call [BOB] {вызываем FCanvasUtil :: DrawString(int x, int y, ushort const *, UFont *, FColor)}
end;
FreeLibrary(DLLInstance);
end;

procedure FLayerCanvasRender; cdecl;
asm
{перед вызовом FPlayerSceneNode :: Render рисуем текст}
call HelloWorld
retf 0DC24h
end;

procedure doDll();
var
DLLInstance : THandle;
PlayerScenAdr: PByte;
Offset: DWORD;
begin
{ загружаем DLL }
DLLInstance := LoadLibrary('Engine.dll');
{перехвачиваем FPlayerSceneNode::Render}
PlayerScenAdr := GetProcAddress(DLLInstance, adres2);
if VirtualProtectEx(GetCurrentProcess,PlayerScenAdr,1 0,PAGE_EXECUTE_READWRITE,Offset) then begin
PlayerScenAdr^ := $E9;
Offset := Dword(@FLayerCanvasRender)-DWord(PlayerScenAdr)-5;
move(Offset,Pointer(DWord(PlayerScenAdr)+1)^,sizeo f(Offset));
end;


end;

exports
doDll;

begin
doDll();
end.



Вот мой код.
Осталось подправить аргумент шрифта)
UFont - хз как там

mira
04.10.2010, 01:19
library MyFirstDLL;
uses
SysUtils,
Classes,
Graphics,
Forms,
Windows;
const
adres = '?DrawString@FCanvasUtil@@QAEHHHPBGPAVUFont@@VFCol or@@@Z';
adres1 = '??1FCanvasUtil@@UAE@XZ';
adres2 = '?Render@FPlayerSceneNode@@UAEXPAVFRenderInterface @@@Z';
text ='ALF';

procedure HelloWorld();
var
DLLInstance : THandle;
FCanvasUtilAddr,BOB: PByte;
font:string;
x,y:integer;
begin
{ загружаем DLL }
DLLInstance := LoadLibrary('Engine.dll');
BOB := GetProcAddress(DLLInstance, adres);
FCanvasUtilAddr := GetProcAddress(DLLInstance, adres1);
font :='Engine.DefaultFont'; {ХЗ КАКОЙ ШРИФТ ЮЗАЕТ ЛИНЕЙКА}
x:=200;
y:=200;
asm
push 00FF0000h {цвет}
push dword [font]{Шрифт, В ФОРМАТЕ UFont - я хз как}
push word [text] {Текст}
push y {у}
push x {х}
mov ecx, FCanvasUtilAddr
call [BOB] {вызываем FCanvasUtil :: DrawString(int x, int y, ushort const *, UFont *, FColor)}
end;
FreeLibrary(DLLInstance);
end;

procedure FLayerCanvasRender; cdecl;
asm
{перед вызовом FPlayerSceneNode :: Render рисуем текст}
call HelloWorld
retf 0DC24h
end;

procedure doDll();
var
DLLInstance : THandle;
PlayerScenAdr: PByte;
Offset: DWORD;
begin
{ загружаем DLL }
DLLInstance := LoadLibrary('Engine.dll');
{перехвачиваем FPlayerSceneNode::Render}
PlayerScenAdr := GetProcAddress(DLLInstance, adres2);
if VirtualProtectEx(GetCurrentProcess,PlayerScenAdr,1 0,PAGE_EXECUTE_READWRITE,Offset) then begin
PlayerScenAdr^ := $E9;
Offset := Dword(@FLayerCanvasRender)-DWord(PlayerScenAdr)-5;
move(Offset,Pointer(DWord(PlayerScenAdr)+1)^,sizeo f(Offset));
end;


end;

exports
doDll;

begin
doDll();
end.



Вот мой код.
Осталось подправить аргумент шрифта)
UFont - хз как там

выложи скрин че там получилось)

ALF
04.10.2010, 01:23
та скринь не чего)
Клиет не находит шрифт и сразу закрывается (без ошибки)

P.S. Если ошибка в длинне аргументов то будет ошибка
History: FCanvasUtil::DrawString <- ViewportLock1 <- Precaching <-
UGameEngine::Draw <- UWindowsViewport::Repaint <-
UWindowsClient::Tick <- ClientTick <- UGameEngine::Tick <- UpdateWorld <- MainLoop
Если нету ошибки в длинне - то все норм.
Но так как мы хз что за фонт юзает л2, и как передать этот аргумент - нас л2 просто закрывает)

Добавлено через 1 минуту
как видиш я использую font :='Engine.DefaultFont' - это не правильно
тип аргумента должен быть UFont, а у меня string получается)
Мало того надо знать шрифт...
Хотя обычно в Unreal Engine-овских играю по идеи юзается Engine.DefaultFont хД

Morfik
04.10.2010, 02:13
та скринь не чего)
Клиет не находит шрифт и сразу закрывается (без ошибки)
....

тут проблема не в этом

1-й ляп:
хук рендера - для функций ла2 такой сплайсинг не катит, тут нету волшебных 5 байтов, код нужно восстанавливать

2-й ляп

adres1 = '??1FCanvasUtil@@UAE@XZ';
...
FCanvasUtilAddr := GetProcAddress(DLLInstance, adres1);
...
mov ecx, FCanvasUtilAddr
....

??1FCanvasUtil@@UAE@XZ
это
public: virtual __thiscall FCanvasUtil::~FCanvasUtil(void)

на русском - это деструктор для класса FCanvasUtil, т.е. по сути его метод, а нужно передать именоо УКАЗАТЕЛЬ НА ОБЬЕКТ, и он не экспортируемый, в этом и есь вся сложность.

Очень рекомендую тебе ознакомиться с темой классов в с++ а также что такое соглашение вызова thiscall.

mira
04.10.2010, 02:14
та скринь не чего)
Клиет не находит шрифт и сразу закрывается (без ошибки)

P.S. Если ошибка в длинне аргументов то будет ошибка
History: FCanvasUtil::DrawString <- ViewportLock1 <- Precaching <-
UGameEngine::Draw <- UWindowsViewport::Repaint <-
UWindowsClient::Tick <- ClientTick <- UGameEngine::Tick <- UpdateWorld <- MainLoop
Если нету ошибки в длинне - то все норм.
Но так как мы хз что за фонт юзает л2, и как передать этот аргумент - нас л2 просто закрывает)

Добавлено через 1 минуту
как видиш я использую font :='Engine.DefaultFont' - это не правильно
тип аргумента должен быть UFont, а у меня string получается)
Мало того надо знать шрифт...
Хотя обычно в Unreal Engine-овских играю по идеи юзается Engine.DefaultFont хД

ахахахах засунул дельфовский стринг в функцию :D
там или объект нада совать или указатель на PWideChar непомню уже

ALF
10.10.2010, 20:26
тут проблема не в этом

1-й ляп:
хук рендера - для функций ла2 такой сплайсинг не катит, тут нету волшебных 5 байтов, код нужно восстанавливать

2-й ляп

adres1 = '??1FCanvasUtil@@UAE@XZ';
...
FCanvasUtilAddr := GetProcAddress(DLLInstance, adres1);
...
mov ecx, FCanvasUtilAddr
....

??1FCanvasUtil@@UAE@XZ
это
public: virtual __thiscall FCanvasUtil::~FCanvasUtil(void)

на русском - это деструктор для класса FCanvasUtil, т.е. по сути его метод, а нужно передать именоо УКАЗАТЕЛЬ НА ОБЬЕКТ, и он не экспортируемый, в этом и есь вся сложность.

Очень рекомендую тебе ознакомиться с темой классов в с++ а также что такое соглашение вызова thiscall.

А может можно создать в делфи констуктор??

Morfik
10.10.2010, 20:32
??0FCanvasUtil@@QAE@ABV0@@Z - как насчет этого?
FCanvasUtil :: FCanvasUtil (FCanvaUtil const &)

а это один из конструкторов :D
я же написал что сам объект класса не экспортируемый

ALF
10.10.2010, 20:36
Это никакую идею не дает?

procedure Example;
var
MyObj: TMyClass; // класс, который вы создаете
MyList: TList; // встроенный класс
begin
MyObj := TMyClass.Create;
// теперь MyObj содержит адрес блока памяти,
// распределенной для экземпляра вашего класса
MyList := TList.Create;
// Код для работы с MyList
// ....
// здесь что-то делаем с объектом
// ....
MyList.Free;
// Ресурсы MyList удаляются из кучи
MyObj.Free;
// тоже самое для MyObj
end;

mira
10.10.2010, 22:41
А может можно создать в делфи констуктор??

нет) можно только вызвать существующий.
кстате классы дельфи и си малось несовместимы)
у С++ хранит указатель на экземпляр класса в ЕСХ а в делфях непомню

Добавлено через 3 минуты
Это никакую идею не дает?
[/PHP]

вообще никаких идей не дает :search:

ALF
14.10.2010, 17:00
??0FCanvasUtil@@QAE@PAVFRenderTarget@@PAVFRenderIn terface@@W4EVertexShader@@W4EPixelShader@@@Z
Конструктор?)
Если да - то огромное тебе спасибо)
С остальным думаю уже сам расберусь!!)
Если че то и те с шрифтом помогу)))

mira
14.10.2010, 20:32
??0FCanvasUtil@@QAE@PAVFRenderTarget@@PAVFRenderIn terface@@W4EVertexShader@@W4EPixelShader@@@Z
Конструктор?)
Если да - то огромное тебе спасибо)
С остальным думаю уже сам расберусь!!)
Если че то и те с шрифтом помогу)))

судя по деассемблированому коду да) функция заполняет объект данными и инициализирует их и возвращает в EAX готовый объект канвасутил.

у меня встроиный в игру дизассамблер)))))))))))

ALF
14.10.2010, 21:08
как нам получить pfnt:pointer?
методом
GetProcAddress(dll,??0FCanvasUtil@@QAE@ABV0@@Z);?
или как...?
и как хукаешь
??0FCanvasUtil@@QAE@PAVFRenderTarget@@PAVFRenderIn terface@@W4EVertexShader@@W4EPixelShader@@@Z
О_о

mira
15.10.2010, 09:30
про сплайсинг почитай.
Там нада перехватить функции тока 1 раз при запуске. Шрифт из какова метода я брал в комменте смари. В обоих случаях после вызова их клиентом EAX содержит готовые обьекты

Добавлено через 9 минут
460294749 ася

izen
09.11.2010, 08:03
Можно и так.

1610

ALF
19.04.2011, 00:41
Кому надо функция определения времени

...
TimeBuff du 128 dup (?)
Time SYSTEMTIME
TimeStr du '%02d:%02d:%02d',0,0
...
proc GetTime
GetLocalTime(Time)
movzx eax,[Time.wHour]
movzx ebx,[Time.wMinute]
movzx ecx,[Time.wSecond]
cinvoke wsprintfW,TimeBuff,TimeStr,eax,ebx,ecx
ret
endp
в TimeBuff будет время в типе WideString

Добавлено через 23 часа 16 минут
Определение расширения монитора
proc GetX
.if [isSetDx] = 0
GetDC(0)
GetDeviceCaps(eax,8 )
.endif
ret
endp
После GetDeviceCaps в EAX будед расширение по Х. По У думаю не надо)

supernewbie
19.04.2011, 13:04
во те рабочий ДХ пример

ниче се, он ещё и работает, надо будет разобрать..

гыгы :D

PS как у них так красиво получилось написать PROTECTED?)

Aries
19.04.2011, 13:27
че-то я раньше не замечал эту тему)))
Спс АLF за ап темы xD


Мира, зараза, как же ты все таки так красиво все сделал? :не нашел смайлика, долбящегося головой об стену:

mira
19.04.2011, 14:12
ниче се, он ещё и работает, надо будет разобрать..

гыгы :D

PS как у них так красиво получилось написать PROTECTED?)

дравтекст клиентский. Хукать директх чтоб нарисовать одну строчку имхо бред) хотя фрапс хукает

Добавлено через 5 минут
че-то я раньше не замечал эту тему)))
Спс АLF за ап темы xD


Мира, зараза, как же ты все таки так красиво все сделал? :не нашел смайлика, долбящегося головой об стену:


у меня щас сплеш скрин прикольный в клиенте, полупрозрачный с непрозрачной эльфийкой и падают снежинки разного размера. Одни ближе другие дальше)

Aries
19.04.2011, 14:41
дравтекст клиентский. Хукать директх чтоб нарисовать одну строчку имхо бред) хотя фрапс хукает

Добавлено через 5 минут


у меня щас сплеш скрин прикольный в клиенте, полупрозрачный с непрозрачной эльфийкой и падают снежинки разного размера. Одни ближе другие дальше)

выложи что ли пару скринов, хоть позавидуем тут)

Morfik
19.04.2011, 16:55
Мира, зараза, как же ты все таки так красиво все сделал? :не нашел смайлика, долбящегося головой об стену:


учи ДХ ) там гляди перекинешся с плагинов на игры к разработке самих игр) или плагинов на новом уровне )

зы: эх самому не хватает времени и высидки ДХ поразгребать

ALF
19.04.2011, 20:31
Хз.. Я хукаю функции UCanvas для прорисовки текста (UCanvas::DrawTextTTFToCanvas) и другие для рисования фигур)
Причем пока что все сделано на FASM =)
Думаю правда на делфи перейти)

mira
20.04.2011, 00:59
ну вот сплеш и меню выбора профиля