CDecl清理代码在显式链接的DLL

CDecl cleanup code in explicitly linked DLL

本文关键字:链接 DLL 代码 CDecl      更新时间:2023-10-16

我在一个非托管的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:ntMagnitude: %fntDirection (radians): %fnn", retVal.mag, retVal.dir);

如果不包含内联程序集,则在调用addVecs后程序崩溃。

是否有任何方法我可以写EXE或DLL,这样内联汇编指令是不需要的?例如,printf也是__cdecl函数,但我不需要编写内联汇编来确保每次调用堆栈后都清理堆栈。

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

typedef VECTOR (__cdecl *addVecs_ptr)( VECTOR, VECTOR, VECTOR, VECTOR );
static addVecs_ptr addVecs = NULL;

如果你使用了像这样的类型定义,它会使稍后加载地址时的强制转换变得容易:

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