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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 21.03.2014, 21:53   #1
troyan90
Пользователь
 
Регистрация: 23.06.2011
Сообщений: 54
По умолчанию Работа с указателями (Delphi и Visual c++)

Нужна помощь в переводе кода из делфи в c++.
Есть рабочий код из одного opensource плагина для Inno setup. вот он
Код:
function Call0():longint; stdcall;
asm
  push ebx
  mov eax,0
  mov ebx,0
  call ebx
  pop ebx
end;

function Call1(Param1:longint):longint; stdcall;
asm
  push ebx
  mov eax,0
  mov ebx,0
  mov edx,Param1
  call ebx
  pop ebx
end;

const parray:array[0..1]of pointer=(@Call0, @Call1);

function wrapcallback(CalledFunc, this: cardinal; NumParam: integer): pointer; stdcall;
var 
	pt, Myadr: pointer;
begin
   pt := VirtualAlloc(nil, $100, MEM_RESERVE or MEM_COMMIT, PAGE_EXECUTE_READWRITE);
   if (NumParam >= 0) and (NumParam <= (length(parray)-1)) then begin
      Myadr := parray[NumParam];
      move(Myadr^, pt^, 80);
      PCardinal(pointer(cardinal(pt) + 5))^ := this;
      PCardinal(pointer(cardinal(pt) + 10))^ := CalledFunc;
      result := pt;
   end else result:=nil;
end;
вот что пока есть:
Код:
long int __stdcall call0()
{
	__asm
	{
		push ebx
		mov eax,0
		mov ebx,0
		call ebx
		pop ebx
	}
}

long int __stdcall call1(long int Param1)
{
	__asm 
	{
		push ebx
		mov eax,0
		mov ebx,0
		mov edx,Param1
		call ebx
		pop ebx		
	}
}

const void* proc[] = {&call0, &call1};

void* __stdcall wrawcallback(unsigned func, unsigned what, int count)
{
	unsigned* pt = (unsigned*)VirtualAlloc(0, 0x100, MEM_RESERVE | MEM_COMMIT, PAGE_EXECUTE_READWRITE);
	unsigned* addr = (unsigned*)&proc[count];
	memmove(pt, addr, 80);

	return pt;
}
застрял на указателях. как правильно перевести этот участок
Код:
move(Myadr^, pt^, 80);
PCardinal(pointer(cardinal(pt) + 5))^ := this;
PCardinal(pointer(cardinal(pt) + 10))^ := CalledFunc;
и еще, что с ассемблером, совместимо ли в vs asm вставки из delphi?
troyan90 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с указателями yaapelsinko Общие вопросы Delphi 3 15.02.2012 01:13
Работа с указателями Byurrer Общие вопросы C/C++ 8 02.04.2011 21:09
Работа с указателями. Alex Cones Общие вопросы Delphi 8 06.07.2010 18:34
Работа с указателями Masip Общие вопросы Delphi 2 12.06.2010 12:49
Работа с указателями!!! HKBD Общие вопросы C/C++ 1 06.10.2008 07:52