У меня есть функция в неуправляемой 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
функция пока что мне не нужно писать встроенную сборку, чтобы гарантировать, что стек очищается после каждого вызова, который я к нему обращаюсь.
Вы должны убедиться, что соглашение о addVecs
верно. Это стоит того, чтобы прямо об этом говорить, и не полагаться на настройки по умолчанию вашего компилятора.
typedef VECTOR (__cdecl *addVecs_ptr)( VECTOR, VECTOR, VECTOR, VECTOR );
static addVecs_ptr addVecs = NULL;
Если вы использовали typedef, подобный этому, это облегчает приведение позже, когда вы загружаете адрес:
addVecs = (addVecs_ptr) GetProcAddress( hSomeDllHandle, "addVecs" );