Один неприятный трюк заключался в злоупотреблении CallWindowProc
для вызова произвольного кода путем передачи указателя на него. Это технически нарушает контракт этой функции, поскольку предполагается, что он будет использоваться только с дескрипторами (не указателями прямого кода), полученными через GetWindowLong
; но на практике так мало людей на самом деле знают это, что реализация вынуждена разрешать произвольные указатели кода. Это позволяет вам вызывать любой указатель на функцию, если он stdcall
, и принимает 4 аргумента того же размера, что и WndProc
аргумент.
Еще один неприятный трюк, который является следствием вышеизложенного, заключается в том, что вы можете динамически генерировать код таким образом - просто вставьте его в байтовый массив и используйте CallWindowProc
для перехода к нему. Таким образом, вы можете встроить не-VB6-собственный код в приложение VB6 без каких-либо внешних DLL. Конечно, в эпоху NX-битов, включенных по умолчанию, это, вероятно, уже не такая уж хорошая идея (если она когда-либо была, то есть) ...