0

我在非托管 Win32 DLL 中有一个函数,它接受可变数量的参数,因此需要使用__cdecl而不是__stdcall任何其他调用约定。目前我正在显式链接到 DLL(也就是说,我正在使用LoadLibraryGetProcAddress不是链接到 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函数,但我不需要编写内联汇编来确保在每次调用后清理堆栈。

4

1 回答 1

1

您需要确保调用约定addVecs是正确的。明确这一点是值得的,而不是依赖于编译器的默认值。

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

static addVecs_ptr addVecs = NULL;

如果您使用过这样的 typedef,它可以让您稍后在加载地址时轻松进行转换:

addVecs = (addVecs_ptr) GetProcAddress( hSomeDllHandle, "addVecs" );
于 2015-05-28T03:55:37.657 回答