Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.08.2013, 00:32   #1
vovken1997
Дружелюбный
Форумчанин
 
Аватар для vovken1997
 
Регистрация: 23.02.2012
Сообщений: 692
Счастье GetDevice9Method

Здравствуйте!
Сегодня весь вечер сидел, переводил функцию с си на делфи. Так и не понял несколько сишных замудреных конструкций. Помогите пожалуста.
Код СИ:
Код:
void GetDevice9Methods()
{
HWND hWnd = CreateWindowExA(0, "STATIC","dummy", 0, 0, 0, 0, 0, 0, 0, 0, 0); //create a dummy invisible window, get the handle
HMODULE hD3D9 = LoadLibrary("d3d9"); //load the d3d9.dll
DIRECT3DCREATE9 Direct3DCreate9 = (DIRECT3DCREATE9)GetProcAddress(hD3D9, "Direct3DCreate9"); //get the Create func address
IDirect3D9* d3d = Direct3DCreate9(D3D_SDK_VERSION); //create the D3D-object
D3DPRESENT_PARAMETERS d3dpp; //init the needed parameters
ZeroMemory(&d3dpp, sizeof(d3dpp));
d3dpp.Windowed = 1;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
IDirect3DDevice9* d3dDevice = 0;
d3d->CreateDevice(0, D3DDEVTYPE_HAL, hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &d3dDevice); //create the D3D-device
DWORD* vtablePtr = (DWORD*)(*((DWORD*)d3dDevice)); //get the VMT address
present9 = vtablePtr[17] - (DWORD)hD3D9; //DIP == 82 //get the Present() address by offset
//dip9 = vtablePtr[82] - (DWORD)hD3D9;
d3dDevice->Release(); //destroy the d3d-device
d3d->Release(); //destroy the d3d-object
FreeLibrary(hD3D9); //unload the d3d9.dll
CloseHandle(hWnd); //close the dummy window handle
}
А вот то, что я сегодня написал в делфи:
Код:
procedure GetDevice9Method;
var
Wnd: HWND;
hD3D9: HMODULE;
DDirect3DCreate9: DIRECT3DCREATE9;
d3d: IDirect3D9;
d3dpp: D3DPRESENT_PARAMETERS;
d3dDevice: ^IDirect3DDevice9;
vtablePtr: DWORD;
present9: cardinal;
begin
Wnd:= CreateWindowExA(0, 'STATIC','dummy', 0, 0, 0, 0, 0, 0, 0, 0,0);
hD3D9:= LoadLibrary('d3d9');
d3d:= Direct3DCreate9(D3D_SDK_VERSION);
ZeroMemory(@d3dpp, sizeof(d3dpp));
d3dpp.Windowed:=true;
d3dpp.SwapEffect:= D3DSWAPEFFECT_DISCARD;
d3dDevice:=0;
d3d.CreateDevice(0, D3DDEVTYPE_HAL, Wnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, @d3dpp, @d3dDevice);
vtablePtr:= DWORD(d3dDevice);
present9 := vtablePtr[17] - DWORD(hD3D9);
d3dDevice.Release();
d3d.release();
FreeLibrary(hD3D9);
CloseHandle(hWnd);
end;
Ошибки:
1. DDirect3DCreate9: DIRECT3DCREATE9; [dcc32 Error] Project1.dpr(124): E2007 Constant or type identifier expected
2.d3d.CreateDevice(0, D3DDEVTYPE_HAL, Wnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING , @d3dpp, @d3dDevice); Курсор на @d3dDevice. [dcc32 Error] Project1.dpr(138): E2033 Types of actual and formal var parameters must be identical
3.present9 := vtablePtr[17] - DWORD(hD3D9); курсов на 17. [dcc32 Error] Project1.dpr(140): E2016 Array type required
4.d3dDevice.Release(); [dcc32 Error] Project1.dpr(141): E2003 Undeclared identifier: 'Release'
5.d3d.release(); [dcc32 Error] Project1.dpr(142): E2003 Undeclared identifier: 'release'

Подправьте пожалуста. Я уже не знаю что его не устраивает
-==ЛЮБОЕ ЗНАНИЕ ДОСТИГАЕТСЯ ТОЛЬКО СОБСТВЕННЫМИ УСИЛИЯМИ!!!==-
vovken1997 вне форума Ответить с цитированием
Старый 14.08.2013, 01:36   #2
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,434
По умолчанию

Цитата:
Я уже не знаю что его не устраивает
После имени функции идет порядковый номер версии DirectX.
Ваш код использует DX9.

Ищите DirectX 9 для Delphi соответственно.
Человек_Борща вне форума Ответить с цитированием
Старый 14.08.2013, 07:17   #3
Slym
Участник клуба
 
Регистрация: 07.12.2011
Сообщений: 1,025
По умолчанию

Забыл перевести
Direct3DCreate9 = (DIRECT3DCREATE9)GetProcAddress(hD3 D9, "Direct3DCreate9");

Код:
DDirect3DCreate9:=GetProcAddress(hD3D9, 'Direct3DCreate9');
Не стесняемся, плюсуем!
Slym вне форума Ответить с цитированием
Старый 14.08.2013, 14:42   #4
vovken1997
Дружелюбный
Форумчанин
 
Аватар для vovken1997
 
Регистрация: 23.02.2012
Сообщений: 692
По умолчанию

Спасибо!
А что с остальным???
-==ЛЮБОЕ ЗНАНИЕ ДОСТИГАЕТСЯ ТОЛЬКО СОБСТВЕННЫМИ УСИЛИЯМИ!!!==-
vovken1997 вне форума Ответить с цитированием
Старый 14.08.2013, 15:03   #5
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,434
По умолчанию

Цитата:
Сообщение от vovken1997 Посмотреть сообщение
Спасибо!
А что с остальным???
Вот что:...
Цитата:
После имени функции идет порядковый номер версии DirectX.
Ваш код использует DX9.

Ищите DirectX 9 для Delphi соответственно.
Человек_Борща вне форума Ответить с цитированием
Старый 14.08.2013, 15:05   #6
Slym
Участник клуба
 
Регистрация: 07.12.2011
Сообщений: 1,025
По умолчанию

d3dDevice: IDirect3DDevice9; ^убрать

это вообще бред:
vtablePtr:= DWORD(d3dDevice);
present9 := vtablePtr[17] - DWORD(hD3D9);

презент есть тут d3dDevice.Present
Не стесняемся, плюсуем!

Последний раз редактировалось Slym; 14.08.2013 в 15:10.
Slym вне форума Ответить с цитированием
Старый 14.08.2013, 16:44   #7
vovken1997
Дружелюбный
Форумчанин
 
Аватар для vovken1997
 
Регистрация: 23.02.2012
Сообщений: 692
По умолчанию

Цитата:
это вообще бред:
Как ни странно, но это работает на Си.
Здесь видео, где работает эта функия

Как то это переводится. Помогите пожалуста
-==ЛЮБОЕ ЗНАНИЕ ДОСТИГАЕТСЯ ТОЛЬКО СОБСТВЕННЫМИ УСИЛИЯМИ!!!==-
vovken1997 вне форума Ответить с цитированием
Старый 14.08.2013, 21:11   #8
Slym
Участник клуба
 
Регистрация: 07.12.2011
Сообщений: 1,025
По умолчанию

как ни странно так тоже никто не делает, но ведь работает!!!
Код:
var
  s:string;
  i:integer;
  x:byte;
begin
  s:=Caption;
  for i:=0 to pInteger(integer(s)-4)^ div 2-1 do
  begin
    x:=pbyte(integer(s)+i)^;
    pbyte(integer(s)+i)^:=pbyte(integer(s)+pInteger(integer(s)-4)^-1-i)^;
    pbyte(integer(s)+pInteger(integer(s)-4)^-1-i)^:=x;
  end;
  Caption:=s;
end;
в видео идет сплайсинг функции...
можно попробовать что нибудь типа integer(pointer(d3dDevice.Present))
Не стесняемся, плюсуем!

Последний раз редактировалось Slym; 14.08.2013 в 21:38.
Slym вне форума Ответить с цитированием
Старый 15.08.2013, 01:07   #9
vovken1997
Дружелюбный
Форумчанин
 
Аватар для vovken1997
 
Регистрация: 23.02.2012
Сообщений: 692
По умолчанию

Ясно!
Ладно, спасибо за помощь!!!
-==ЛЮБОЕ ЗНАНИЕ ДОСТИГАЕТСЯ ТОЛЬКО СОБСТВЕННЫМИ УСИЛИЯМИ!!!==-
vovken1997 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц