显式链接的 DLL 中的 CDecl 清理代码
CDecl cleanup code in explicitly linked DLL
我在非托管 Win32 DLL 中有一个函数,它接受可变数量的参数,因此需要 __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" );
我在非托管 Win32 DLL 中有一个函数,它接受可变数量的参数,因此需要 __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" );