Код очистки CDecl в явно связанной DLL

У меня есть функция в неуправляемой DLL Win32, которая принимает переменное число аргументов и, следовательно, должна быть __cdecl скорее, чем __stdcall или любое другое соглашение о вызовах. На данный момент я явно ссылаюсь на DLL (то есть, я использую LoadLibrary а также GetProcAddress вместо ссылки на DLL .lib файл).

Я могу вызвать функцию просто отлично, но так как это cdecl Мне нужно добавить следующую встроенную инструкцию по сборке после каждого вызова:

retVal = addVecs(v1, v2, v3, v4);
__asm add esp, 64 ;Sizeof VECTOR struct is 16 bytes
printf("The sum of all these vectors is:\n\tMagnitude: %f\n\tDirection (radians): %f\n\n", retVal.mag, retVal.dir);

Если я не включаю встроенную сборку, то программа вызывает сбой после вызова addVecs.

Есть ли какой-нибудь способ, которым я могу написать или EXE или DLL так, чтобы не требовалась встроенная инструкция по сборке? Например, printf также __cdecl функция пока что мне не нужно писать встроенную сборку, чтобы гарантировать, что стек очищается после каждого вызова, который я к нему обращаюсь.

0

Решение

Вы должны убедиться, что соглашение о addVecs верно. Это стоит того, чтобы прямо об этом говорить, и не полагаться на настройки по умолчанию вашего компилятора.

typedef VECTOR (__cdecl *addVecs_ptr)( VECTOR, VECTOR, VECTOR, VECTOR );

static addVecs_ptr addVecs = NULL;

Если вы использовали typedef, подобный этому, это облегчает приведение позже, когда вы загружаете адрес:

addVecs = (addVecs_ptr) GetProcAddress( hSomeDllHandle, "addVecs" );
1

Другие решения


По вопросам рекламы [email protected]