-
void *pFlip = (*reinterpret_cast<void***>(Surf))[11];
ptrdiff_t pDDSFlipDiff = reinterpret_cast<ptrdiff_t>(pFlip) - reinterpret_cast<ptrdiff_t>(GetModuleHandle(_T("ddraw.dll")));
-
а пацаловат?
-
> (*reinterpret_cast<void***>(Surf))
почему не 5 звездочек?
-
> почему не 5 звездочек?
- чем вам не угодил указатель на массив указателей?
-
> void *pFlip = (*reinterpret_cast<void***>(Surf))[11];
> ptrdiff_t pDDSFlipDiff = reinterpret_cast<ptrdiff_t>(pFlip)
> - reinterpret_cast<ptrdiff_t>(GetModuleHandle(_T("ddraw.
> dll")));
динамическое приведение типов
pFlip указатель без определения конкретного типа, видимо в дельфе это будет pointer
ptrdiff_t - некоторый тип, скорее всего определенный непосредственно в коде, а не в сторонней библиотеке.
Соответственно определяешь переменные:
Var
pFlip : Pointer;
pDDSFlipDiff : ptrdiff_t;
а далее нужно сделать приведение типов
Surf к pFlip
а вторая строка бред какой-то :-)
в первой я так понимаю берут указатель на поверхность, а вот зачем во второй вычитают из этого указателя хандл модуля? :-(
-
По-моему, такой язык не имеет права существовать.
-
> По-моему, такой язык не имеет права существовать.
- а такой?
typedef void *pointer;
typedef pointer pointer_array_t[]; /*хотя вот это - согласен - не очень логично выглядит*/
typedef pointer_array_t *pointer_array_p;
pointer pFlip = (*reinterpret_cast<pointer_array_p>(Surf))[11];
-
__исходный* код() (н_е) должен<быть_похож>[на]->вывод*испорченного_телетайпа, подключённого<<к (зашумлённой)линии с *плохо_синхронизированной частотой;
-
> DiamondShark © (18.02.11 11:43) [5]
Есть просто криворукие программисты
Побуквенно перевести на дельфи - выйдет ничуть не лучше.
-
> Побуквенно перевести на дельфи - выйдет ничуть не лучше.
- нееe - в Паскале таки придется описать тип косвенной ссылки на указатель, либо таки честно развернуть разадресацию...
pp:= PPointer(surf)^;
inc(pp, 11);
pFlip:= PPointer(pp)^;
- такой вот дядя Вирт зануда - специально ведь так сделал...
-
> han_malign (18.02.11 16:15) [9]
Можно более полный пример с типами и т.д.?
Не понимаю где проблема написать типа
:= Pointer(PPointer(surf)^ + 11);
-
Это космический синтаксис при всем уважении к С++.
-
> reqyz (11.02.11 13:00)
>
> void *pFlip = (*reinterpret_cast<void***>(Surf))[11];
> ptrdiff_t pDDSFlipDiff = reinterpret_cast<ptrdiff_t>(pFlip)
> - reinterpret_cast<ptrdiff_t>(GetModuleHandle(_T("ddraw.
> dll")));
человек был явно пьян, долго не мылся и у него все чесалось
-
"Единственное препятствие: получить адрес метода COM-объекта вызовом GetProcAddress не удастся. Это не так страшно, ведь можно создать DirectDraw-поверхность, и узнать положение метода Flip относительно базового адреса исполняемого файла, в который было произведено внедрение."
http://habrahabr.ru/blogs/programming/111339/
-
var pFlip: PChar;
pFlip:= PChar(Surf^) + 11*SizeOf(Pointer);
pDDSFlipDiff:= pFlip - GetModuleHandle("ddraw.dll");
-
-
> oxffff © (18.02.11 20:22) [11]
> Это космический синтаксис при всем уважении к С++.
Еще раз: если побуквенно перевести на дельфи - выйдет ровно такая же ахинея.
Но ни один хоть чуточку нормальный человек так не пишет. Как минимум есть смысл объявить свои типы: сразу и читабельность повысится и удобство.
Еще надо будет на досуге подумать: чем void с пятью звездочками отличается от void с одной звездочкой, один фик адресная арифметика к указателю на void не применима.
-
> Еще надо будет на досуге подумать: чем void с пятью звездочками
> отличается от void с одной звездочкой, один фик адресная
> арифметика к указателю на void не применима.
???
pp:^PPointer;
begin
{$POINTERMATH ON}
pp[1,1]:=nil;
{$POINTERMATH OFF}
-
> [16] KSergey © (19.02.11 12:14)
> чем void с пятью звездочками отличается от void с одной
> звездочкой
Выдержкой выпитого перед написанием.
-
> oxffff © (19.02.11 12:38) [17]
Это что? где void?
-
> KSergey © (20.02.11 10:29) [19]
> > oxffff © (19.02.11 12:38) [17]
>
> Это что? где void?
(untyped pointer)
pointer=*void
> Еще надо будет на досуге подумать: чем void с пятью звездочками
> отличается от void с одной звездочкой, один фик адресная
> арифметика к указателю на void не применима.
К void с 5 *, можно применить 4 уровня адресной арифметики.
-
> Вам страшно, да, а вон что паскаль живородящий делает:
Ну не для средних умов...вполне себе настройка параметров на основании конфига. Ну сделана непривычно, но функцию вроде выполняет.
-
К тому же я не удивлюсь, если это окажется сгенерированным кодом
-
> oxffff © (20.02.11 12:08) [20]
Дошли руки.
Побаловался я. Занятно.
К указателю на void адресная арифметика действительно не применима, однако к указателю на указатель - уже отлично применима. Видимо логично: размер указателя на void - он известен...