Здравствуйте, vasilyev, Вы писали:
V>...Вот нашел (http://www.drizzle.com/~scottb/gdc/ — статья за 2001 год, очень рекомендую), вроде пошло, счас буду ковыряться:
V>V>DWORD Call_stdcall( const void* args, size_t sz, DWORD func )
V> {
V> DWORD rc; // here's our return value...
V> __asm {
V> mov ecx, sz // get size of buffer
V> mov esi, args // get buffer
V> sub esp, ecx // allocate stack space
V> mov edi, esp // start of destination stack frame
V> shr ecx, 2 // make it dwords
V> rep movsd // copy it
V> call [func] // call the function
V> mov rc, eax // save the return value
V> }
V> return (rc);
V> }
Статью не читал, но смысл этого кода — вызвать функцию __stdcall с
фиксированным количеством аргументов (переменное кол-во не возможно по конвенции __stdcall в принципе).
Если этой прокси-функции передать, скажем, 5 DWORD аргументов (sz == 20) и вызвать __stdcall функцию, которая принимает только 2 аргумента, последняя просто проигнорирует 3 лишних. Единственный эффект — не упадёт при возврате из

И этот код не работает при sz не кратном 4.
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth