Re[3]: Вызвать функцию из DLL с любым количеством аргуметнов
От: gear nuke  
Дата: 14.04.06 09:03
Оценка: 1 (1) +1
Здравствуйте, 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
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.